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

1

hashCode と equals を実装する必要があります。HashMaps は、hashCode に基づいてオブジェクトをバケットに入れます。異なるオブジェクトが同じ hashCode を持つことができますが、ルールは、2 つの等しいオブジェクトが同じ hashCode を持つ必要があるということです。HashMap は、hashCode が同じエントリをすべて見つけると、equals メソッドを使用して等価性をチェックします。

デフォルトの実装では、オブジェクト インスタンスが等しいかどうか、つまり、2 つのオブジェクトが同じインスタンスであるかどうかがチェックされます。あなたの場合、2 つの異なるインスタンスをチェックしています。

クラスの 2 つのインスタンスが等しいかどうかを判断するのはこれだけであると仮定して、equals および hashCode メソッドをオーバーライドして、private String メンバー変数の hashCode() および equals() によって返される値を渡します。

于 2013-12-01T01:04:45.733 に答える