hashcode等于对象存储的内存地址吗?
不一定相等。
首先:因为==是比较对象的内存地址的,如下题所示结果。
另外,有个大神直接用java&c++试了一下,点击查看
结论是:hashCode返回的并不一定是对象的(虚拟)内存地址,具体取决于运行时库和JVM的具体实现。
hashCode()的返回值和==的关系
若x == y返回“true”,那么x和y的hashCode()必须相等。
若x == y返回“false”,那么x和y的hashCode()有可能相等,也有可能不等。
验证代码如下:
<span style="font-size:18px;">public class Test {
public static void main(String[] args) {
Integer i1=-128,i2=-128,i3=-129,i4=-129;
System.out.println("i1==i2 "+(i1==i2));
<span style="white-space: pre;"> </span>System.out.println("i1的hashcode="+i1.hashCode()+",i2的hashcode="+i2.hashCode());
<span style="white-space: pre;"> </span>System.out.println("i3==i4 "+(i3==i4));
<span style="white-space: pre;"> </span>System.out.println("i3的hashcode="+i3.hashCode()+",i4的hashcode="+i4.hashCode());
//输出结果为:
/*
i1==i2 true
i1的hashcode=-128,i2的hashcode=-128
i3==i4 false
i3的hashcode=-129,i4的hashcode=-129
*/
}
}</span>
对象的hashcode是用来干什么的?
是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值。一定程度上反映了对象的位置信息。
所以常与equals一起来判断对象是否相等。
这位博主写的很好:(原文链接:http://blog.csdn.net/chinayuan/article/details/3345559)
<span style="font-size:18px;">以java.lang.Object来理解,JVM每new一个Object,它都会将这个Object丢到一个Hash哈希表中去,这样的话,下次做Object的比较或者取这个对象的时候,它会根据对象的hashcode再从Hash表中取这个对象。这样做的目的是提高取对象的效率。具体过程是这样:
1.new Object(),JVM根据这个对象的Hashcode值,放入到对应的Hash表对应的Key上,如果不同的对象确产生了相同的hash值,也就是发生了Hash key相同导致冲突的情况,那么就在这个Hash key的地方产生一个链表,将所有产生相同hashcode的对象放到这个单链表上去,串在一起。
2.比较两个对象的时候,首先根据他们的hashcode去hash表中找他的对象,当两个对象的hashcode相同,那么就是说他们这两个对象放在Hash表中的同一个key上,那么他们一定在这个key上的链表上。那么此时就只能根据Object的equal方法来比较这个对象是否equal。当两个对象的hashcode不同的话,肯定他们不能equal.</span>
hashcode的获取方式
1.对象.hashcode();
//如果重写了,按照重写的规则返回hashcode,对象为null,报空指针异常
2.System.identityHashCode(Object x);
//即使重写了hashcode方法,也会返回jdk给出的hashcode。如果对象为null,返回0