Java是面向对象编程的,但是对于基本数据类型确实没有对象的,这就会发生矛盾,所以就有了包装类
byte --------------> Byte
short --------------> Short
int --------------> Integer
long --------------> Long
char --------------> Character
float --------------> Float
double --------------> Double
boolean --------------> Boolean
包装类的自动拆装箱:即基本数据类型与对应的包装类可以直接对应
Integer b=10; //在编译时,jvm会将其转换为Integer b = Integer.valueof(10),这便是自动装箱,即基本数据类型转换为包装类型
int a = b; //自动拆箱
128陷阱,看下例
Integer num1=100;
Integer num2=100;
System.out.println(num1 == num2); //true
Integer num3=128;
Integer num4=128;
System.out.println(num3 == num4); //false
原因:因为Integer在编译时,会变为 Integer.valueof(),我们看该方法的原码,会发现其是用一个cache数组来存储数据的,如下:
而关于cache数组,我们查看其原码,
发现其大小是-128~127,也就是说,当Integer的值是出于-128~127之间时,会直接使用cache数组中已经存储好的值,再看valueof的原码,当数据是在这个范围外时,就会在堆内存中新开辟一个Integer的空间,所以此时num3==num4的值为false
我们可以通过一些小练习来更好的掌握
public static void main(String[] args) {
int a = 10;
int b = 10;
Integer a1 = 10;
Integer b1 = 10;
Integer a2 = new Integer(10);
Integer b2 = new Integer( 10);
System.out.println(a == b); //true
System.out.println(a1==b1); //true,Integer的值在-128~127之间,所以此时用的是cache数组中的值,所以true
System.out.println(a2== b2); //false,a2和b2都是新开辟的Integer对象,所以地址不同,所以false
System.out.println(a1 == a); //true,当包装类用==与基本数据类型比较时,会自动拆箱
System.out.println(a1.equals(a)); //true,此时会自动装箱,与上一个情况类似
System.out.println(a1 == a2); //false,地址不同,a2是新开辟的,a1是cache数组中的
System.out.println(a == a2); //自动拆箱
}