i++后的哈希码会变的原因
i++后的哈希码会变的原因
Synchronized同步锁的是同一个对象,如果对象发生改变,则会失去效果
先上代码:
public class IntegerHashCode { public static void main(String[] args) { Integer integer = 1; //System.identityHashCode:返回原生的hashCode值,不管Object对象是被重写;空引用的哈希代码为零 System.out.println("++前的hashCode值---"+System.identityHashCode(integer)); integer++; System.out.println("++后的hashCode值---"+System.identityHashCode(integer)); } }
运行结果:
结果发现 ++前 和 ++后 的hashCode值并不相同,这是为什么呢?
我们一步一步找原因:
1.反编译此java文件
可以发现:
integer++ 是这样的 Integer integer1 = this.num, integer2 = this.num = Integer.valueOf(this.num.intValue() + 1);
2. 查看 Integer.valueOf() 的源代码
这时发现,它是重新 new 出一个新的 Integer,这样的话,每 ++ 一次,那么就会产生一个新的对象,新的对象的hashCode值是不同的。