wukun1983 2008-07-15 18:34
浏览 443
已采纳

请教hashCode的问题的底层原理

我想请问一下hashCode到底代表什么东西呢,对象的hashcode和内存地址有什么关系啊?

Set s1 = new HashSet();
Set s2 = new HashSet();

s1.add(new String("abc"));
s2.add(new String("abc"));

System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
我这创建了2个不同的hashset对象,他们的内容一样时hashcode就一样,这是不是说只要对象的内容一样,计算的hashcode就一样呢,那他们在内存中是怎么回事啊,内存地址到底是怎么分配的?

还有个问题,这是jdk1.5中hashmap中put方法的源代码,
public V put(K key, V value) {
K k = maskNull(key);
int hash = hash(k);
int i = indexFor(hash, table.length);
for (Entry e = table; e != null; e = e.next) {
if (e.hash == hash && eq(k, e.key)) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, k, value, i);
return null;
}

hashset的底层实际上是hashmap,通过一个entry数组来是实现的,数组的每一个元素又是一个链表,这个理解了。

不理解这句话 if (e.hash == hash && eq(k, e.key))

这怎么能说明两个对象相同呢,eq方法的实现是用的==,这就是说k和e.key比较的是引用,那如果我超hashset里面add一个内容相同的对象,这个方法返回的比较的是2个对象的引用,应该返回false才对啊,我觉得这个好像永远都不成了啊。
里面还是上面那个问题,这里的e.hash == hash是什么意思啊,hash的本质到底是什么,这个值到底代表什么啊?

我以前就看过这个东西,一直十分困惑,看了你的视频后稍微了解了一点,但是还是有些模糊,希望你能解答的疑惑!

  • 写回答

4条回答 默认 最新

  • iteye_794 2008-07-17 10:22
    关注

    hashCode是指对象的散列码,具体值是由对象的hashCode()方法返回的值,,你甚至可以重写该方法让每个对象的hashCode都一样。散列码一般是和HashTable HashMap这种基于散列码的集合有用,用于提高在集合中查询对象的速度。
    而内存地址是对象在内存中的位置,一般和hashCode无关。不过Object对象的hashCode方法是个native方法,有可能和对象的内存地址有关,没深究。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!