1

这是我的代码:

import java.util.HashMap;

class MyString
{
  String string;

  MyString(String string)
  {
    this.string = new String(string);
  }
}

public class test
{

  public void test3()
  {
    HashMap<MyString, Byte> byteHashMap = new HashMap<MyString, Byte>();
    char c = 'A';
    byte b = (byte)c;

    String string = new String("The Letter A");
    MyString myString = new MyString(string);

    byteHashMap.put(myString, b);

    if (byteHashMap.containsKey(myString))
    //if (byteHashMap.containsKey(new MyString(string)))
    {
      System.out.println("true");
    }
    else
    {
      System.out.println("false");
    }
  }

  public static void main(String[] args)
  {
    test testObject = new test();
    testObject.test3();
  }
}

我想知道为什么代码原样返回true。但是,当我切换 if 语句(参见注释行)时,它返回 false。

我相信这与覆盖 MyString 类中的 equals 方法有关,但我不确定如何处理这个问题。

问候。

4

3 回答 3

3

是的,覆盖hashCodeequals。现在,您将字符串与MyString对象的内存引用(标准实现)进行比较。

例子

@Override
public bool equals(Object args0) {
   if(args0 == this) { return true; }
   if(!(args0 instanceof MyString)) { return false; }
   MyString obj = (MyString) args0;

   return obj.getString().equals(this.string); // Create getter
}

@Override
public int hashCode(){
   return this.string.hashCode() * 37;
}
于 2013-12-01T00:59:49.167 回答
3

你的信念是正确的。映射结构依赖于.equals确定映射中是否已经存在键。默认情况下,对象类型具有实例相等性(a.equals(b)当且仅当ab指向同一个对象时,其含义为真)。

在您的情况下,如果字段相等,您可能希望两个MyString实例相等。string在这种情况下,您将使用以下内容覆盖equals

@Override
public boolean equals(Object other) {
    if (other == null) { return false; }
    if (!(other instanceof MyString)) { return false; }
    MyString m = (MyString)other;
    return this.string.equals(m.string);
}

这样,两个 if 语句中的任何一个都将返回 true。

您还应该覆盖hashCode. 如果您使用 Eclipse,它可以很容易地通过Source菜单为您生成这两种方法。

于 2013-12-01T01:02:05.193 回答
1

您需要实现 hashCode 和 equals。HashMaps 根据 hashCode 将对象放入桶中。不同的对象可以有相同的hashCode,但规则是两个相等的对象必须有相同的hashCode。一旦 HashMap 找到具有相同 hashCode 的所有条目,它就会使用 equals 方法检查是否相等。

默认实现检查对象实例是否相等——也就是说,两个对象是否是同一个实例。在您的情况下,您正在检查两个不同的实例。

重写 equals 和 hashCode 方法以传递私有 String 成员变量的 hashCode() 和 equals() 返回的值,假设这就是确定类的两个实例是否相等的全部。

于 2013-12-01T01:04:45.733 回答