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条)

报告相同问题?

悬赏问题

  • ¥100 高价邀请复制 域天d8联网狗
  • ¥15 本题的答案是不是有问题
  • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?