划分
class Solution { public void fun() { Integer a=10; Integer b=10; System.out.println("a==b "+(a==b)); Integer x=128; Integer y=128; System.out.println("x==y "+(x==y)); int k=10; System.out.println("a==k "+(a==k)); int kk=128; System.out.println("x==kk "+(x==kk)); } public static void main(String[] args) { Solution s=new Solution(); s.fun(); } }运行结果
D:\jianzhi>java Solution
a==b true
x==y false
a==k true
x==kk true
第一个为什么为true,
a==b true
x==y false
a==k true
x==kk true
第一个为什么为true,
Integer自动装箱
首先,直接声明Integer a= 10,会自动装箱变为Integer a = Integer.valueOf(10);(Integer a 会自动拆箱为 a.intValue())。
①、第一个打印结果为 true
对于 i == j ,我们知道这是两个Integer类,他们比较应该是用equals,这里用==比较的是地址,那么结果肯定为false,但是实际上结果为true,这是为什么?
我们进入到Integer 类的valueOf()方法:
分析源码我们可以知道在 i >= -128 并且 i <= 127 的时候,第一次声明会将 i 的值放入缓存中,第二次直接取缓存里面的数据,而不是重新创建一个Ingeter 对象。那么第一个打印结果因为 i = 10 在缓存表示范围内,所以为 true。
②、第二个打印结果为 false
从上面的分析我们知道,128是不在-128到127之间的,所以第一次创建对象的时候没有缓存,第二次创建了一个新的Integer对象。故打印结果为false
③、第三个打印结果为 true
Integer 的自动拆箱功能,也就是比较两个基本数据类型,结果当然为true
④、第四个打印结果为 true
解释和第三个一样。int和integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比较。
对于 i == j ,我们知道这是两个Integer类,他们比较应该是用equals,这里用==比较的是地址,那么结果肯定为false,但是实际上结果为true,这是为什么?
我们进入到Integer 类的valueOf()方法:
分析源码我们可以知道在 i >= -128 并且 i <= 127 的时候,第一次声明会将 i 的值放入缓存中,第二次直接取缓存里面的数据,而不是重新创建一个Ingeter 对象。那么第一个打印结果因为 i = 10 在缓存表示范围内,所以为 true。
②、第二个打印结果为 false
从上面的分析我们知道,128是不在-128到127之间的,所以第一次创建对象的时候没有缓存,第二次创建了一个新的Integer对象。故打印结果为false
③、第三个打印结果为 true
Integer 的自动拆箱功能,也就是比较两个基本数据类型,结果当然为true
④、第四个打印结果为 true
解释和第三个一样。int和integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比较。
注:
在写代码的时候发现Integer也有equals方法。那么它和string的equals方法有什么区别呢?
这是Integer的方法源码:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
可以看见是把对比的对象看是不是Integer类型的,是的话就转为int基本类型再用 == 比较,比较的就是数值了。
这是Integer的方法源码:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
可以看见是把对比的对象看是不是Integer类型的,是的话就转为int基本类型再用 == 比较,比较的就是数值了。