java数据类型及其转换与运算

news/2024/7/19 15:42:46 标签: 数据类型, string, java, javac, js

1.java的基本数据类型(八种)与引用数据类型(三种)

一:java数据类型分为两大数据类型

1基本数据类型;2引用数据类型

1:java开发过程中整型用int、小数用double、布尔用boolean;

2:类型转换都是小范围向大范围转换,大范围往小范围转化需要用到强制转换;

    例如:(1)int a=12;double b=a;(2)double a=3.0;int b=(int)a;

3:long,byte,char等很少用到,一般在数据处理的时候会用到;

4:int跟char之间的转换是通过ASCII转化的;

   例如:char a ='A';int b=a;System.out.prientln(b);最后输出的结果为65;

5:String类型,String是项目中必不可少且使用最多的数据类型,它属于引用数据类型中“类”的范畴。

int 和 Integer 有什么区别

Java 是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java 为每一个基本数据类型都引入了对应的包装类型(wrapper class),int 的包装类就是 Integer,从 Java 5 开始引入了自动装箱/拆箱机制,使得二者可以相互转换。

原始类型对应的包装类型:

原始类型boolean、byte、short、long、float、doublecharint
包装类型首字母大写

封装类为各个数据类型提供一些数据的操作方法,可以直接使用;

Integer a= 127 与 Integer b = 127相等吗

对于对象引用类型:==比较的是对象的内存地址。
对于基本数据类型:==比较的是值。

如果整型字面量的值在-128到127之间,那么自动装箱时不会new新的Integer对象,而是直接引用常量池中的Integer对象,超过范围 a1==b1的结果是false:

例如String跟int的互相转化:

 String a = "21";int b = Integer.parseInt(a);//String 转int。

int a = 21; String b = String.valueOf(a);//int转String。

byte、char、short、int、long的长度

一个字节长度是8位,即可以理解为下标为(0-7),只作参考。2个字节(0-15),4个字节(0-31)

引用数据类型:数组、类、接口

java基本数据类型

名称数据类型字节数比特数可表示数范围备注封装类型
整数类型字节型byte182^8-2^4~2^4-1-2^7 ~ (2^7)-1
短整型short2162^16-2^8~2^8-1-2^15 ~ (2^15)-1
整型int4322^32-2^16~2^16-1-2^31 ~ (2^31)-1
长整型long8642^64-2^32~2^32-1-2^63 ~ (2^63)-1
浮点类型浮点型float432
双精度浮点型double864
布尔型boolean18true、false
字符类型字符型char216-2^7 ~ (2^7)-1Character

关于float和double的区别:

总共占用比特位数(32bits和64bits)尾数取值范围有效数字位数定义方法备注
数符(1bit)指数位(小数点的位置)
指数符指数
float(单精度浮点数)1bit表示正负8bits23bits-2^128~2^128-17位(2^23是7位十进制数)8?float a=0.1f(或F)容易损失精度,开发过程不常用
1bit

7bits

"."后边的数字-3.40E38~3.40E38
double(双精度浮点数)1bit表示正负11bits52bits-2^1024~2^1024-116位(2^52是16位十进制数)17?double b=0.1开发过程中常用
1bit10bits-1.79E308~1.79E308

表注:

指数符 :(阶数、移数)表示指数的正负(阶数、移数)表示指数的正负。取值范围(取决于阶数)

指数:(阶数、移数)存指数的有效数字。有效数字位数(取决于尾数)

2.关于数据类型的转换:

先来看一个简单的面试题:short s = s + 1和s += 1的区别。换个说法,为什么short s1 = 1; s1 = s1 + 1;有错,而short s1 = 1; s1 += 1;没有编译错误?

关键字

java, 数据类型, 默认类型,运算符优先级、类型溢出
 

包括我很多人第一眼看题目中两者在运算上毫无区别。由于我们在平时的编程中很少涉及类型溢出、优先级考虑等问题,数据类型、包装类、又是单目运算符,又是三元运算符等等。
但如果涉及到要考虑性能、考虑存储细节,还是要了解一下这些数据类型转换的。

java">short s = 1;
s = s+1;
System.out.println(s);

输出:报错

原因:在s + 1的时候,结果会被“升格”为int类型。将int高级类型转为低级类型,需要强制转换,所以自然编译不会通过。对两个容量不一样的数据类型的变量进行算术运算时,java会自动将小容量的变量进行精度提升,然后再进行运算,得到的结果类型是提升后的大容量的数据类型.如果将该结果赋值给小容量的数据类型的变量,则必须进行强制的类型转换,否则编译程序会报损失精度错。
因为short s1=1在栈中开辟了一个short类型的空间;
而s1=s1+1;中s1是short类型,在栈中开辟了一个short类型的空间,而1是int类型,
int类型比short类型大,所以相加后的结果应为比较大的类型,把s1+1的结果赋予short类型的变量s1,固然需要强行转化;

java">short s = 1;
s += 1;
System.out.println(s);

输出:2

原因:对于“+=”操作,jvm会自动执行类型操作,等价于 s = (short)(s + 1)
由于+=运算符有自加功能,定义short s1 = 1;时,开辟了一个空间,当通过+=运算符运算时,只是在原来的栈中进行运算;不需强行转化。s1+=i的方式java会对i进行窄化转换,由编译程序自动执行。

上面只是浅显一点的原因,再本质的原因,总结如下。
java数据类型

java数据类型(byte, short, char) -> int ->long -> float -> double,从左到右低阶到高级,不同数据类型之间既有能表示范围的区别,同时由于java是强类型语言,所以严格按照(当然还有一些封装方法可以相互转换,这里不扩展,只介绍基本类型)以下规则转换:

隐式转换与显式转换:

java">byte b = 1;
short s =1;
char c =1;
long l = 1;
int i = 1;
float f = 1;
double d = 1.0;

 下表中表示各数据类型之间的转换,列标题表示被转换的类型,行标题表示转换成的类型:

byteshortcharintlongfloatdouble
byte强转强转强转强转强转强转强转
short强转强转强转强转强转强转强转
char强转强转强转强转强转强转强转
inti=b+1i=s+1i=c+1i=i+1强转强转强转
longl=b+1l=s+1l=c+1l=i+1l=l+1强转强转
floatf=b+1f=s+1f=c+1f=i+1f=l+1f=f+1强转
doubled=b+1d=s+1d=c+1d=i+1d=l+1d=f+1d=d+1

自动转换:

低阶变量可以直接转换为高级变量:

byte、short、char、int、long、float、double从左到右精度依次升高。

上表中所有可以用等号直接转的,都是自动转换。

显式转换:

从高级变量转为低级变量,需要使用强制转换,比如short s=1,s=(short)(s+1) ,但是要注意转换后可能丢失精度或者数据溢出。

java的默认类型

java中,整数默认是 int 类型,小数默认是 double 类型 ;因此,在一些地方会造成一些错误,除了上面s + 1中的“1”编译器默认为int类型之外,还有诸如:

    long num = 99999999999999; // error

编译器也是会报错的!原因是编译器把99999999999999当成int类型,然而99999999999999超出了int能表示的范围,所以改成如下就好了:

    long num = 99999999999999L; // ok

运算符优先级

总结:赋值运算符“=”优先级最低,而“+=”运算符比较高,在解析s += 1的时候由于是“+=”操作符,编译器解析时先将其转换为 s = (short)(s + 1),更深层次涉及到jvm如何实现。
java规范中说:
E1 op=E2 实际上等价于 : E1=(T)( (E1)op(E2) )
其中T是E1的数据类型.这种类型转换或者是一个恒等转换,或者是一个窄化转换.
这个说明java是一种强类型的语言,对数据类型的要求是非常严格的,否则会引起混乱.
下面解释一下三种类型转换:恒等转换(相同容量的两个数据类型之间的赋值);拓宽转换(小容量类型赋值给大容量类型);窄化转换(大容量赋值给小容量类型). 实际上,前两种转换都是编译程序自动执行的,而窄化转换则要求必须显式的执行。

如果i=5;那么a=(++i)--;之后,a和i的值各是多少? 


http://www.niftyadmin.cn/n/800803.html

相关文章

递归(recursion)方法

递归recursion方法计算1-100之间所有自然数的和 public static int sum(int n){if (n 1)return 1;elsereturn n sum(n-1);}【练习7.1】 //递归阶乘public static int Factorial(int n){if (n1)return 1;elsereturn n*Factorial(n - 1);}【练习7.2】 public static int Series…

java基本注解

在项目中常遇到的基本注解 1. Entity创建实体类 2. Table :对应的数据表名 3. Id :主键 4. GeneratedValue:主键生成策略 5. Column : 映射表对应的字段名 6. Basic : 表示该属性是表字段的映射。 如果实体的字…

人工智能时代,应立即学习python

人工智能时代,应立即学习python 应用:web开发,自动化运维开发,自动化测试,数据分析,机器学习 1.python 快速易学习2.python 基于web开发(zhihu:tornad web框架, jdanggo 大型python网络web框架&#xff0c…

stl使用中的经验(十七)--查找算法count/find/binary_search/lower_bound/upper_bound和equal_range

很多时候,我们都能遇到在一对迭代器标识的区间中查找一些信息,stl提供了比较多的查找算法,而我们也要根据不同的情况选择不同的算法进行查找,但基于的目的总是快速、简单和高效。 这样也就有了我们在选择具体的查找策略时&#x…

j2ee之struts2的国际化数据方式

和不用框架的时候一样,需要写你要改变的文字的配置文件(文件名_语言缩写_国家缩写.properties) 可以参考我之前写的j2ee之国际化数据方式 然后在struts.xml的配置文件中加入常量配置,如果不知道可以到源码的default.properties里面…

LC 旋转数组

LC 旋转数组给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 进阶: 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗? …

项目中常用环境搭建以及安装包网址

常用环境搭建以及安装包网址: 前端: node.js 环境安装 http://nodejs.cn/ vue安装 https://cn.vuejs.org/ 后端: idea下载 https://www.jetbrains.com/idea/ MySQL下载(所有版本) MySQL :: Download MySQL Commu…

LC 存在重复元素

LC 存在重复元素给定一个整数数组,判断是否存在重复元素。 如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。 中规中矩的思路,超时!!! class S…