Java HashMap查找在相同的密钥上失败

时间:2015-11-18 09:43:07

标签: java hashmap

我有一个小错误,可能源于我对HashMap的误解,它杀了我。我已经提供了一小段测试代码来说明问题。

为了简洁,我省略了Prefix类,但我的前缀只是单词的数组。它们是不可变的,因此在构造它们时克隆传递给构造函数的字符串数组。实现了Hashcode()equals()方法,因此条件传递。本质上问题是我只能使用prefix1而不是prefix2取消引用后缀列表(在后一种情况下它会返回null。

仅供参考,我的Hashmap只是声明为:

// Stores mappings between "prefixes" (consecutive word phrases) and "suffixes" (successor words).
private Map<Prefix, ArrayList<String>> prefixSuffixPairs;

感谢任何帮助。

   ArrayList<String> suffixInList = new ArrayList<String>();
   suffixInList.add("Suffix1");
   suffixInList.add("Suffix2");

   String[] prefixWords1 = new String[] {"big", "the"}; 
   Prefix prefix1 = new Prefix(prefixWords1);

   String[] prefixWords2 = new String[] {"big", "the"}; 
   Prefix prefix2 = new Prefix(prefixWords2);

   prefixSuffixPairs.put(prefix1, suffixInList);

   if(prefix1.hashCode() == prefix2.hashCode()) {
      System.out.println("HASH CODE MATCH");
   }

   if(prefix1.equals(prefix2)) {
      System.out.println("VALUES MATCH");
   }

   ArrayList<String> suffixOutList = null;
   suffixOutList = prefixSuffixPairs.get(prefix2);
   suffixOutList = prefixSuffixPairs.get(prefix1);   

  public int hashCode() {

  int result = 1;
  for( int i = 0; i< words.length; i++ )
  {
      result = result * HASH_PRIME + words[i].hashCode();
  }

  return result;
  }

  public boolean equals(Prefix prefix) {

  if(prefix.words.length != words.length) {
     return false;
  }

  for(int i = 0; i < words.length; i++) {
     if(!prefix.words[i].equals(words[i])) {
        return false;
     }
  }

  return true;
  } 

1 个答案:

答案 0 :(得分:4)

public boolean equals(Prefix prefix) {

它不会覆盖Object#equals(因此HashMap不会使用它)。

您只是提供了一个不相同的同名方法(重载) - 但您可以从下面的方法中调用它:

尝试

@Override
public boolean equals(Object prefix) {

@Override并不是绝对必要的,但是如果你将它应用到你的第一个方法,它会使编译器能够检测到这个问题(当你的断言被覆盖错误时会出现错误)。