线性探测哈希表find方法无法返回对应值,请求协助排查错误
问题分析与解决方案
嘿,我来帮你搞定这个哈希表find方法的问题!你的代码没法正确返回对应key的value,核心问题出在用==比较引用类型的键上——这在Java里是个非常常见的新手坑。
为什么==不行?
在Java中,==对于引用类型(比如自定义的Key类、甚至非常量池的String对象)来说,比较的是两个对象的内存地址,而不是它们的内容是否相等。举个例子:
- 如果你有两个内容完全一样的自定义Key对象:
Key a = new Key("test"); Key b = new Key("test");,a == b会返回false,因为它们是内存中两个不同的对象。 - 哪怕是String,如果你用
new String("hello")创建对象,而不是直接用字面量,==也会失效。
这就导致你的find方法里,哪怕table里有内容匹配的键,==也会判断为不相等,自然找不到对应的value。
修复方案
把==替换成Java中判断对象内容相等的标准方法:equals(),同时要确保你的键类型K正确重写了equals()和hashCode()方法。
修改后的find方法代码:
public V find(K key){ for (int i = getHashValue(key); table[i] != null; i = (i + 1) % thesize) { // 改用equals()比较键的内容 if (table[i].key.equals(key)) { return table[i].value; } } // 未找到键的情况 System.out.println(" Could not find '" + key.toString() +"'s value"); return null; }
关键补充:重写equals()和hashCode()
如果K是你自定义的类,必须同时重写这两个方法,不然默认的equals()还是和==一样比较内存地址,而且哈希表的哈希函数(你的getHashValue)依赖hashCode()来计算正确的哈希桶位置——只重写其中一个会导致哈希表工作异常。
举个自定义Key类的示例:
import java.util.Objects; public class MyKey { private String uniqueId; public MyKey(String uniqueId) { this.uniqueId = uniqueId; } // Getter方法 public String getUniqueId() { return uniqueId; } @Override public boolean equals(Object o) { // 先判断是否是同一个对象 if (this == o) return true; // 判断是否为null或者类型不匹配 if (o == null || getClass() != o.getClass()) return false; // 强转后比较核心属性 MyKey myKey = (MyKey) o; return Objects.equals(uniqueId, myKey.uniqueId); } @Override public int hashCode() { // 用核心属性生成哈希值 return Objects.hash(uniqueId); } }
额外提示
如果你的键可能为null,还要在equals比较前加个null判断,避免空指针异常:
if (key == null) { if (table[i].key == null) return table[i].value; } else if (table[i].key.equals(key)) { return table[i].value; }
不过大多数哈希表实现会禁止键为null,你可以根据自己的需求调整。
内容的提问来源于stack exchange,提问作者b.alex
相关产品推荐
相关产品推荐

