本文共 2139 字,大约阅读时间需要 7 分钟。
1,自动装箱
自动装箱其实就是将基本数据类型转换为引用数据类型(对象)2,自动拆箱
自动拆箱其实就是将引用数据类型转化为基本数据类型程序测试:
public static void main(String[] args) { Integer num1 = 1; //这里就用到了自动装箱;等同于Integer a = new Integer(1); int num2 = num1 - 1; //对象不能直接进行计算,所以这里有自动拆箱的操作, // 将a对象转换成基本数据类型,然后-1 System.out.println(num1); System.out.println(num2);}
测试结果:
1,int是基本数据类型,Integer是引用数据类型
2,int默认值是0,Integer默认值是null
3,int类型直接存储数值,Integer需要实例化对象,指向对象的地址
public static void main(String[] args) { Integer a = new Integer(8); Integer a1 = new Integer(8); Integer b = 8; Integer b1 = 8; int c = 8; int c1 = 8; Integer d = new Integer(130); int d1 = 130; Integer e = 128; Integer e1 = 128; System.out.println(a == a1); //false System.out.println(a == b); // false //两个new出来的对象地址不一样 //new Integer() 是新建一个对象,与其他Integer的引用不同 System.out.println(b == c); // true System.out.println(b == b1); // true System.out.println(d == d1); // true //int 类型的自动封装,与 Integer 声明的变量,总是指向同一地址 //封装类和基本数据类型进行比较的时候,java会自动拆箱,然后比较数值是否相等。 System.out.println(c1 == c1); // true //都是基本数据类型的值肯定相等 System.out.println(e == e1); // false //Integer声明的变量的值在[-128,127]范围时, //地址指向相同(byte范围的数是从常量池中获取) //超过这个范围,会重新new一个,所以不相同}
结论:
Integer只在127范围内才是同地址,超出就false
int和任意Integer都是同一地址
因为java在进行编译时 Integer e = 128
会被编译成 Integer.valueOf(128)
,这个可以通过反编译 class 文件看到。而通过 Integer 源码可以得出,Integer.valueOf()
方法会在数值-128~127
之间会对 Integer 进行缓存,不会再重新 new 一个,所以 b==b1 为 true
;当数值二大于127或者小于-128的时候则会重新 new 一个,所以 d == d1 为 false
。
Integer的valueOf方法如下:
== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针作。
1,比较的是操作符两端的操作数是否是同一个对象。
2,两边的操作数必须是同一类型的(可以是父子类之间)才能编译通过。
3,比较的是地址,如果是具体的阿拉伯数字的比较,值相等则为true,如:
int a=10
与 long b=10L
与 double c=10.0
都是相同的(为true),因为他们都指向地址为10的堆。 转载地址:http://shjwi.baihongyu.com/