一. 基本数据类型
- byte - 1 - 8bit - 0
- short - 2 - 16bit - 0
- int - 4 - 32bit - 0
- long - 8 -64bit - 0L
- float - 4 -32bit - 0.0f
- double - 8 - 64bit - 0.0d
- char - 2 -16bit - \u0000
- boolean - true(1) or false(0) - 1bit - false
问题1:Java中boolean类型占用多少个字节?
boolean只有true或false,即1或0,可以用1bit存储,但计算机处理数据的最小单位是1个字节,1个字节等于8位,实际存储的空间官方没有明确规定。
二. 包装类
- Byte
- Short
- Integer
- Long
- Float
- Double
- Character
- Boolean
装箱:基本类型 → 包装类
int i1 = 1;
//Integer i2 = new Integer(i1);
Integer i2 = Integer.valueOf(i1); //手动装箱
拆箱:包装类 → 基本类型
int i3 = i2.intValue(); //手动拆箱
基本类型与其对应的包装类间进行赋值时使用自动装箱(Autoboxing)与自动拆箱(Unboxing)完成
int i1 = 1;
Integer i2 = i1; //自动装箱
int i3 = i2;//自动拆箱
问题2:new Integer(127) 、 Integer.valueOf(127)、 Integer.valueOf(128)的区别?
/*new Integer()每次新建一个对象*/
/*Integer.value()首先创建并使用Integer缓存池(-127~128)中的对象,重复调用会取得同一
对象的引用,如果赋值超出缓存池,则valueOf()方法给缓存池new新对象,因此地址值改变*/
Integer x1 = new Integer(127);
Integer x2 = new Integer(127);
System.out.println(x1 == x2); //false
Integer x3 = Integer.valueOf(127);
Integer x4 = Integer.valueOf(127);
System.out.println(x3 == x4); //true
Integer x5 = Integer.valueOf(128);
Integer x6 = Integer.valueOf(128);
System.out.println(x5 == x6); //false
三. 引用数据类型
引用类型指向一个对象,指向对象的变量是引用变量,如
Person p = new Person("name"); //引用类型Person的引用变量p指向new出的Person对象
引用变量被声明类型后不能再改变类型,对象、数组均为引用数据类型,默认值为null
四. 数据类型的转换
1. 自动类型转换
运算时,先转换为同类型(低转高),再计算
低 byte, char, short -> int -> long -> float -> double 高,boolean无法类型转换
2. 强制类型转换
容量大的类型转换为容量小的类型时必须使用强制类型转换
/*强制类型转换要注意两点:精度损失、数据溢出*/
double i1 = 70.5; //浮点类型默认是double,可以不加d,float必须加f,如70.5f
int i2 = (int)i1; //70,精度损失,浮点数到整数的转换是直接舍弃小数得到
int i3 = 128;
byte i4 = (byte)i3; //溢出,byte一个字节,取值范围-128~127
3. 各类转换
List转int数组
List<Integer> list = new ArrayList<>();
list.stream().mapToInt(Integer::valueOf).toArray();