0

オブジェクトからインスタンスの1つを返すtoStringメソッドをオーバーライドするかどうか疑問に思っていますが、衝突を引き起こす可能性が高くなりますか?例えば、

class Student{
   private String name;
   private double gpa;
   public Student(String name, double gpa){
      this.name = name;
      this.gpa = gpa;
   }
   public String toString(){
      return name;
   }
}

したがって、問題は、Studentオブジェクトを出力するときに名前を表示したいのですが、同じ名前(異なるgpa)を持つ2人の異なる学生が、すべてをHashMapに格納すると、問題が発生することです。元のStudentクラスを変更せずに、または最小限の変更で衝突を回避するための代替手段は何ですか?

4

5 に答える 5

1

あなたのタグを考えると、HashMap でのハッシュ衝突について話しているようですか?

toString()HashMap の動作とは何の関係もありません。HashMap のキーになるオブジェクトの重要なメソッドは と の 2 つだけequals(Object)ですhashcode()

また、HashMap は衝突に対して安全であるため、ハッシュの衝突を気にする必要はありません。

于 2013-02-06T04:26:14.163 に答える
0

in javaのデフォルトの実装はhashCode、すべての変数の値を混合し、それをハッシュすることです。だから、それは何であるかは関係ありませんtoString

于 2013-02-06T05:33:33.163 に答える
0

たぶんこれが役立ちます:

class Student{
    private static AtomicInteger nextUniqueID = new AtomicInteger (0);

    private final int uniqueID = nextUniqueID.getAndIncrement ();
    private String name;
    private double gpa;
    public Student(String name, double gpa){
        this.name = name;
        this.gpa = gpa;
    }
    public String toString(){
        return name + " [" + uniqueID + "]";
    }
}
于 2013-02-06T05:24:22.463 に答える
0

HashMap、HashSetなどのハッシュテーブルベースのコレクションでクラスを使用する場合は、オーバーライドしhashCodeて正しく実装する必要があります。HashMapとは関係ありません。equalstoString

于 2013-02-06T04:46:03.017 に答える
0

HashMap は内部的にテーブルに格納されます。キーはテーブル インデックスを識別するために使用されるため、テーブル インデックスを決定するために hashCode 値が使用されるため、キー クラスが hashCode() をオーバーライドすることが重要です。2 つの異なるキーが同じハッシュ コードになる場合、または異なるハッシュ コードが同じテーブル インデックスにマップされる場合、衝突が発生します。これは、2 つの異なるエントリが同じバケットの場所を指すことを意味します。競合がある場合、前のエントリが新しい (キー、値) にリンクされるため、リンクされたリストが開始されます。

学生クラスをキーとして使用する場合は、hashCode() をオーバーライドすることが重要です。衝突を最小限に抑えるために、 hashCode() が一意の値を返すようにしてください。2 人の生徒が同じ名前の場合は、ID にも依存する必要があります。その場合、名前と ID の両方を使用して hashCode を計算する必要があります。また、equals() をオーバーライドしていることを確認してください。これは衝突の場合に重要です。key.equals() は、リンクされたリストでキーを識別するのに役立ちます。

于 2013-02-08T05:19:41.283 に答える