web-dev-qa-db-ja.com

JavaでのhashCodeの使用は何ですか?

Javaでは、obj.hashCode()は何らかの値を返します。プログラミングでのこのハッシュコードの使用法は何ですか?

141
Vinoth Kumar

hashCode()は、HashHashMapHashTableなどのHashSet実装でbucketingに使用されます。

hashCode()から受け取った値は、セット/マップの要素を保存するためのバケット番号として使用されます。このバケット番号は、セット/マップ内の要素のアドレスです。

contains()を実行すると、要素のハッシュコードを取得し、ハッシュコードが指すバケットを探します。同じバケット内に複数の要素が見つかった場合(複数のオブジェクトが同じハッシュコードを持つことができる場合)、equals()メソッドを使用してオブジェクトが等しいかどうかを評価し、contains()が等しいかどうかを判断しますtrueまたはfalse、または要素をセットに追加できるかどうかを決定します。

197
aishu

Javadoc から:

オブジェクトのハッシュコード値を返します。このメソッドは、Java.util.Hashtableで提供されるようなハッシュテーブルの利点のためにサポートされています。

hashCodeの一般契約は次のとおりです。

  • Javaアプリケーションの実行中に同じオブジェクトで複数回呼び出される場合は常に、hashCodeメソッドは一貫して同じ整数を返す必要があります、オブジェクトの等値比較で使用される情報が変更されない場合。この整数は、あるアプリケーションの実行から同じアプリケーションの別の実行まで一貫性を保つ必要はありません。

  • equals(Object)メソッドに従って2つのオブジェクトが等しい場合、2つのオブジェクトのそれぞれでhashCodeメソッドを呼び出すと、同じ整数結果が生成される必要があります。

  • 2つのオブジェクトがequals(Java.lang.Object)メソッドに従って等しくない場合、それぞれのhashCodeメソッドを呼び出すことはnotである必要があります2つのオブジェクトは、異なる整数の結果を生成する必要があります。ただし、プログラマは、等しくないオブジェクトに対して異なる整数結果を生成すると、ハッシュテーブルのパフォーマンスが向上する可能性があることに注意する必要があります。

合理的に実用的である限り、Objectクラスによって定義されたhashCodeメソッドは、個別のオブジェクトに対して個別の整数を返します。 (これは通常、オブジェクトの内部アドレスを整数に変換するによって実装されますが、この実装手法はJavaには不要です。 _プログラミング言語。)

30
John Topley

hashCode()によって返される値は、オブジェクトのハッシュコードです。これは、オブジェクトのメモリアドレス(16進数)です。

定義により、2つのオブジェクトが等しい場合、それらのハッシュコードも等しくなければなりません。 equals()メソッドをオーバーライドすると、2つのオブジェクトの同等化方法が変更され、オブジェクトのhashCode()の実装は無効になります。したがって、equals()メソッドをオーバーライドする場合は、hashCode()メソッドもオーバーライドする必要があります。

この回答はJava SE 8公式チュートリアルドキュメントから

12
Eli

hashCode()は、オブジェクトを受け取り、数値を出力する関数です。オブジェクトが変更されない場合、オブジェクトのハッシュコードは常に同じです。

オブジェクトを保存する必要があるHashMapHashTableHashSetなどの関数は、内部配列のサイズを法とするhashCodeを使用して、どの「メモリ位置」で選択するかを選択します。 (つまり、配列の位置)オブジェクトを格納します。

衝突が発生する場合があり(2つのオブジェクトが同じハッシュコードで終わる)、もちろん、慎重に解決する必要があります。

12
roottraveller

ハッシュコードはビジネスロジックとは何の関係もありませんが、ほとんどの場合、それを処理する必要があります。オブジェクトがハッシュベースのコンテナー(HashSet、HashMap ...)に配置されると、コンテナーが要素のハッシュコードを配置/取得するためです。

ハッシュコードは、任意のオブジェクトから生成された数値です。

これにより、オブジェクトをハッシュテーブルにすばやく保存/取得できます。

次の単純なexampleを想像してください:

目の前のテーブルに。また、それぞれに1〜9の番号が付いた9つのボックスがあります。これらのボックスに格納する非常に異なるオブジェクトの山もありますが、それらが入ったら、できるだけ早く見つける必要があります。

必要なのは、各オブジェクトをどのボックスに入れるかを即座に決定する方法です。これはインデックスのように機能します。キャベツを見つけることにしたので、キャベツがどの箱に入っているかを調べ、その箱にまっすぐに行きます。

インデックスを気にしたくなく、オブジェクトが存在するボックスをすぐに見つけられるようにしたいと考えてください。

例では、これを行うための非常に簡単な方法を使用してみましょう-オブジェクトの名前の文字数。キャベツはボックス7に入り、エンドウ豆はボックス3に入り、ロケットはボックス6に入り、バンジョーはボックス5に入ります。

サイはどうですか? 10文字なので、アルゴリズムを少し変更し、10文字のオブジェクトがボックス1に、11文字がボックス2に、というように「ラップアラウンド」します。それはあらゆるオブジェクトをカバーするはずです。

ボックスには複数のオブジェクトが含まれることがありますが、ロケットを探している場合は、キャベツ、エンドウ、バンジョー、サイの山全体をチェックするよりも、ピーナッツとロケットを比較する方がはるかに高速です。

それはハッシュコードです。 Hashtableに保存できるようにオブジェクトから数値を取得する方法。 Javaでは、ハッシュコードは任意の整数にすることができ、各オブジェクトタイプは独自のコードを生成します。 Objectの「hashCode」メソッドを検索します。

ソース- ここ

0
Satyajit Das

HashCode()の用途の1つは、キャッチメカニズムの構築です。この例を見てください:

        class Point
    {
      public int x, y;

      public Point(int x, int y)
      {
        this.x = x;
        this.y = y;
      }

      @Override
      public boolean equals(Object o)
      {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Point point = (Point) o;

        if (x != point.x) return false;
        return y == point.y;
      }

      @Override
      public int hashCode()
      {
        int result = x;
        result = 31 * result + y;
        return result;
      }

class Line
{
  public Point start, end;

  public Line(Point start, Point end)
  {
    this.start = start;
    this.end = end;
  }

  @Override
  public boolean equals(Object o)
  {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    Line line = (Line) o;

    if (!start.equals(line.start)) return false;
    return end.equals(line.end);
  }

  @Override
  public int hashCode()
  {
    int result = start.hashCode();
    result = 31 * result + end.hashCode();
    return result;
  }
}
class LineToPointAdapter implements Iterable<Point>
{
  private static int count = 0;
  private static Map<Integer, List<Point>> cache = new HashMap<>();
  private int hash;

  public LineToPointAdapter(Line line)
  {
    hash = line.hashCode();
    if (cache.get(hash) != null) return; // we already have it

    System.out.println(
      String.format("%d: Generating points for line [%d,%d]-[%d,%d] (no caching)",
        ++count, line.start.x, line.start.y, line.end.x, line.end.y));
}
0
Sudabe-Neirizi

ハッシュコードは、オブジェクトの作成ごとにJVMによって生成される一意のコードです。ハッシュテーブルを使用して、ハッシュテーブルを使用してハッシュ関連のアルゴリズムで何らかの操作を実行します。一意のコードがそのobjを見つけるのに役立つオブジェクト。ただし、ハッシュコードがobjのアドレスであるとは言えません。これは、すべてのオブジェクトに対してJVMによって生成された一意のコードです。これが、今では1日のハッシュアルゴリズムです。z最も人気のある検索アルゴリズムです。

0
pritish sahu