Java支持两种数据类型:基本数据类型 和 引用数据类型
基本数据类型
基本数据类型可以分为四大类:整数类型(byte、short,int 和 long)、浮点类型( float 和 double)、布尔类型(boolean)和字符类型(char) 1字=2字节 , 1字节=8位
类型名称 | 关键字 | 位数 | 默认值 | 取值范围 | 包装类 |
字节型 | byte | 8 | 0 | -128 和 127之间,包含 127 | Byte |
短整型 | short | 16 | 0 | -32768和32767之间 | Short |
整型 | int | 32 | 0 | -2^31 和 2^31-1 | Integer |
长整型 | long | 64 | 0 | -2^63 和 2^63-1 | Long |
单精度浮点类型 | float | 32 | 0.0F或0.0f | 1.4E-45~3.4028235E38 | Float |
双精度浮点类型 | double | 64 | 0.0 | 4.9E-324~1.7976931348623157E308 | Double |
布尔型 | boolean | 8 | false | true 和 false | Boolean |
字符型 | char | 16 | \u0000 | ‘\u0000’(0)和 ‘\uffff’(65,535) | Character |
Java 默认的浮点型为 double,例如,11.11 和 1.111 都是 double 型数值。定义一个float类型必须末尾加f或F 。如:11.11f 和 1.111F(浮点类型不适用于精确小数,如金融货币,建议使用BigDecimal)
数据类型转换
1.自动转换(隐式类型转换 , 数据类型由"小"到"大"排序:(byte、short、char)< int < long < float < double )
整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算。注意:转换前的数据类型的位数要低于转换后的数据类型 且不能对boolean进行类型转换。
2.强制转换 自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转换符:(),但可能造成精度降低或溢出。
注意:字符串不能直接转换为基本类型,但通过基本类型对应的包装类则可以实现把字符串转换成基本类型。 不能对boolean进行类型转换。
short a =1;
int b =20;
long c =100L;
b=a; //b=1 类型由小到大,隐式转换
b=(int)c; //b=100 类型由大到小 ,强转
//在使用运算符进行赋值时如:+=,-=,*=,强制类型转换会自动完成,程序不需要做任何显示声明。
short a =1;
int b =20;
long c =100L;
a+=b+c; //a=121,类型:short
装箱和拆箱
java从jdk1.5之后引入了自动装箱与拆箱
装箱:把基本数据类型转换为包装类。
拆箱:把包装类转换为基本数据类型。
基本数据类型放入集合类中的时候,会进行自动装箱。
三目运算符的使用过程中。当第二,第三位操作数分别为基本类型和对象时,其中的对象就会拆箱为基本类型进行操作。
Integer a = 100;//装箱
int b = a;//拆箱
//-----------------------------------------------------------------------------------------
Integer a = 100;
int b = 100;
System.out.println(a==b);
//结果为true,==比较的是内存地址即new Integer的内存地址-128到127 之间的进行比较时,不会new 对象,而是直接到常量池中获取
包装类与基本数据类型进行比较运算,是先将包装类进行拆箱成基本数据类型,然后进行比较的。
两个包装类型之间的运算,会被自动拆箱成基本类型进行计算。
相关面试题:
short s1 = 1;
s1 = s1 + 1;
short s1 = 1;
s1 += 1;
对于 short s1 = 1; s1 = s1 + 1;由于 1 是 int 类型,因此 s1+1 运算结果也是 int型,需要强制转换类型才能赋值给 short 型。
而 short s1 = 1; s1 += 1;可以正确编译,因为 s1+= 1;相当于 s1 = (short(s1 + 1);其中有隐含的强制类型转换。
引用数据类型
包括:字符串型(String)、类、 数组类型、 枚举类型、 包装类型,注解类型和接口类型
位置:存放在堆中的,栈中存放其具体内容所在内存的地址(调用方法时作为参数是按引用传递的,传递的是引用的副本)