【问题标题】:HashMap containsKey methodHashMap containsKey 方法
【发布时间】:2012-11-20 00:13:02
【问题描述】:

我正在用 java 编写 HashMap 的实现,但在 containsKey 方法中定位正确的存储桶时遇到了一些问题

public class MyHashMap<K, V> {

LinkedList<MyEntry>[] table;
int size;
float maxLoadFactor;

public boolean containsKey(K key) {

    if(this.isEmpty())
        return false;
    if(table[table.length % key.hashCode()].isEmpty())
        return false;
    else {
    for(int i = 0; i < table[table.length % key.hashCode()].size(); i++) { 
        if(table[table.length % key.hashCode()].get(i).key == key)
            return true;
        }
    }
    return false;
}

我遇到的问题主要是 table[table.length % key.hashCode()]。我认为这不是为哈希表找到正确存储桶的正确方法,但我不确定是什么。任何帮助表示赞赏。如果您有任何问题,请告诉我。谢谢。

【问题讨论】:

  • 您需要更具体地了解您遇到的问题。你的代码崩溃了吗?如果有,有什么例外?如果没有,您能否提供一些示例调用代码及其输出的内容,以及您期望它输出的内容。能回答这个问题的信息太少了。
  • 首先要做的是将table.length % key.hashCode() 拉出for循环并将其分配给一个临时对象,这样您就可以轻松地转储它,从而使代码更清晰。
  • LinkedList 对于您的基表来说不是一个很好的选择——它可能会起作用,但性能会很差。而且您的% 表达式倒退了。查看% 是如何定义的。

标签: java hash hashtable


【解决方案1】:

在您使用table.length % key.hashCode() 的每个地方,它都应该是key.hashCode() % table.length。这意味着如果 hashCode 大于表的大小,它将“环绕”到开头。或者更确切地说,它计算 key.hashCode()/table.length 的剩余部分并将其放在那里。希望对您有所帮助!

【讨论】:

  • +1,但重要的是要注意此表达式必须匹配 get()put() 中的相应表达式。最好将其分解为自己的私有方法,例如getBucket()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
  • 2012-04-19
  • 2015-09-19
  • 2020-01-19
  • 2020-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多