Integer a=new Integer(1000);
Integer b= new Integer(1000);
System.out.println(a==b); //false,编译提示用equals
System.out.println(a==1000);//true
Integer c=new Integer(10);
Integer d= new Integer(10);
System.out.println(c==d); //false
System.out.println(c==10); //true
Integer e= 100000000;// 类似Integer.valueOf(int)
Integer f= 100000000;// 类似Integer.valueOf(int)
System.out.println(e==f); //false
Integer e1=10; //类似Integer.valueOf(int)
Integer f1=10; //类似Integer.valueOf(int)
System.out.println(e1==f1);// true
Integer number=3;
Integer g=new Integer(3);
System.out.println(g==number); //false
System.out.println(g==3); //true
总结
两个new出来的一定是false,一个new出来的和一个非new出来的一定是false, 因为他们的内存地址不同;
两个非new出来的integer,-128-127是true,其他false,因为会从缓存中拿数据,其他的只能自己创建;
在装箱的时候自动调用的是Integer的valueOf(int)方法
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
而在拆箱的时候自动调用的是Integer的intValue方法。
public int intValue() {
return value;
}
那么hashmap中的key是Integer会如何呢?
HashMap<Integer, String> map = new HashMap<>();
Integer key = new Integer(200);
Integer key2 = new Integer(200);
map.put(key, "a");
map.put(key2, "a2");
System.out.println(key.hashCode()); // integer 重写了hashcode,返回的是value
System.out.println(key2.hashCode());
map.values().forEach(new Consumer<String>() {
@Override
public void accept(String integer) {
System.out.println(integer); // 结果只有一个a2
}
});
对于hahsmap来说key并不一定是同一个对象,只要hashcode和内容相同,就认为是同一个key。这里也牵扯到为什么重写equals要重写hashcode,这个例子就是个很好的理由哦!
可以看楼主的hashmap源码分析或者自己看一下hashmap源码哦!
网友评论