Integer自动装箱的==和equals结果的探究
先上结论
== :
A == B。总的来说,A和B任意一个为数值,就是进行数值比较,否则进行对象地址的比较。
- 当A、B都为对象的时候,比较地址值是否相同。
- 当A、B存在一个为数值时,直接比较数值。
- 当A为对象,B为(Integer + Integer),B触发拆箱,计算完成后,不装箱,使用数值进行比较,变为同2。
- 都为数值,直接比较数值。
equals:
看下源码
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
- 会对进来的数值进行自动装箱,转换为Object传进来,再判断是否是Integer的同类或子类,不是就返回false,是就接着转换成Integer取出值进行值的比较。
看个实例,运行结果的解答需要综合运用上述内容。
public class Main {
public static void main(String[] args) {
Integer a = 1;
Integer b = 1;
Integer c = new Integer(1);
Integer d = new Integer(2);
Integer e = new Integer(2);
Long f = 3L;
Long g = 1L;
int h = 1;
System.out.println(a == b);//1. true
System.out.println(a == c);//2. false
System.out.println(d == e);//3. false
System.out.println(h == a);//4. true
System.out.println(a == (d - c));//5. true
System.out.println(a.equals(d - c));//6. true
System.out.println(a.equals(f - d));//7. false
System.out.println(g.equals(f - d));//8. true
System.out.println(g == (d - c));//9. true
}
}
解析
System.out.println(a == b);//1. true
Integer会对-128~127进行缓存,自动装箱直接从缓存中取出来,也就是a、b句柄指向的是同一个对象。所以地址值是相同,返回true。
System.out.println(a == c);//2. false
c是new出来的,并非自动装箱从缓存中取出,不是一个对象,返回false。
System.out.println(d == e);//3. false
d和e都是新new出来的,不是同一个对象,返回false。
System.out.println(h == a);//4. true
数值参与==比较,直接比较值,1 == 1 返回true。
System.out.println(a == (d - c));//5. true
d - c 触发拆箱,拆箱后的运算的数值参与比较,所以直接比较数值,1 == 1 返回true。
System.out.println(a.equals(d - c));//6. true
d - c 触发拆箱,拆箱后的运算的数值参与比较,接着发现是Integer的equals方法,开始装箱,d - c为int,转化为Integer,传入equals方法,判断是Integer同类,接着取出数值,发现1 == 1,返回true。
System.out.println(a.equals(f - d));//7. false
f - d 触发拆箱,拆箱后的运算的数值参与比较,接着发现是Integer的equals方法,开始装箱,由于 f 为long类型,所以d - c 向上转为long类型,接着装箱转化为Long,传入equals方法,判断是不是Integer的同类或子类,返回false。
System.out.println(g.equals(f - d));//8. true
f - d 触发拆箱,拆箱后的运算的数值参与比较,接着发现是Long的equals方法,开始装箱,由于 f 为long类型,所以d - c 向上转为long类型,接着装箱转化为Long,传入equals方法,判断是Long的同类,接着取出数值,发现1 == 1,返回true。
System.out.println(g == (d - c));//9. true
d - c 触发拆箱,拆箱后的运算的数值参与比较,1 == 1,返回true。
本文地址:https://blog.csdn.net/qq_36746928/article/details/109579914
推荐阅读
-
可能你不知道的,关于自动装箱和自动拆箱
-
JAVA中Integer.valueOf, parsetInt() String.valueOf的区别和结果
-
Java13-day04【Integer、int和String的相转、自动装箱和拆箱、Date、SimpleDateFormat、Calendar、异常、try...catch、throws】
-
Integer自动装箱的==和equals结果的探究
-
可能你不知道的,关于自动装箱和自动拆箱
-
JAVA中Integer.valueOf, parsetInt() String.valueOf的区别和结果
-
浅谈什么是java的自动装箱和自动拆箱?
-
Java13-day04【Integer、int和String的相转、自动装箱和拆箱、Date、SimpleDateFormat、Calendar、异常、try...catch、throws】
-
Java中 "==" 和 equals 的区别 拓展Integer及IntegerCache缓冲池的介绍
-
【Java基础】Integer的自动拆箱和享元模式,这次我学到了