Java的自动拆箱和自动装箱

作为Java初学者,对所学进行总结,进行通俗演义,有不对的地方请指出:

public class Demo2 {
public static void main(String[] args) {
int n=2;
//首先创建一个基本类型
//进行手动装箱 基本类型 ->对象 (引用类型)
Integer integer=new Integer(n);
//自动装箱
integer=n; //自动执行Integer.valueOf(n);
integer=Integer.valueOf(n);
//自动拆箱
n=integer; //自动调用Integer.intValue();
n=integer.intValue();

}

}

另外 在Java常量池中,会存包装类型 一部分的值,
除了 float 和double
整数是-128~127
char 0~127
boolean 全存
所以
new Integer(128)==new Integer(128) 会是false

https://www.cnblogs.com/dolphin0520/p/3780005.html 这篇博客里,
Integer a = 1;
Integer b = 2;
Integer c = 3;
Integer d = 3;
Integer e = 321;
Integer f = 321;
Long g = 3L;
Long h = 2L;
System.out.println(c==(a+b)); //true
System.out.println(c.equals(a+b));//true
System.out.println(g==(a+b));//true
System.out.println(g.equals(a+b));//fasle
System.out.println(g.equals(a+h));//true
首先 == 是判断地址 而 equals 是判断内容的
那么第一个 虽然都是对象,但是两个值 都没有超过 常量池所存的大小,所以==判断地址是一样的
第二个 true 因为类型一样,值也相同 所以是true
第三个 数字的话 在常量池存的值一样,是共享的 所以 == 也是true
第四个 Long.equals 方法

public boolean equals(Object obj) {
if (obj instanceof Long) {
return value == ((Long)obj).longValue();
}
return false;
}

先比较的是是否同一类,而a+b 运算后 拆箱为 int 再装箱是Integer 类的 所以直接就 false 了

那第五个:拆箱 int +long 自动就转为long 型了 然后再装箱 所以比较的话 当然是true了

如有不正,请指出,谢谢!

猜你喜欢

转载自blog.csdn.net/smile_geek_sq/article/details/81583755