Javaでは、obj.hashCode()
いくつかの値を返します。プログラミングにおけるこのハッシュコードの使用は何ですか?
Javaでは、obj.hashCode()
いくつかの値を返します。プログラミングにおけるこのハッシュコードの使用は何ですか?
回答:
hashCode()
するために使用されるバケット内Hash
のような実装HashMap
、HashTable
、HashSet
等
から受け取った値は、セット/マップの要素を格納するためhashCode()
のバケット番号として使用されます。このバケット番号は、セット/マップ内の要素のアドレスです。
実行contains()
すると、要素のハッシュコードが取得され、ハッシュコードが指すバケットを探します。同じバケット内に複数の要素が見つかった場合(複数のオブジェクトが同じハッシュコードを持つことができます)、equals()
メソッドを使用してオブジェクトが等しいかどうかを評価し、次にcontains()
trueかfalseかを判断します。セットに追加されたかどうか。
equals()
を使用して評価します」。したがって、一致するハッシュコード要素が1つしか見つからなかった場合、直接trueを返しますか?しかし、複数のオブジェクトが同じハッシュコードを持つ可能性があるためequals()
、一致した要素が等しいかどうかを評価するために実行する必要があるため、予期しない結果になる可能性があります。
hashCode()
メソッドを手動で呼び出すのはどのような場合ですか?
Javadocから:
オブジェクトのハッシュコード値を返します。このメソッドは、によって提供されるようなハッシュテーブルのメリットのためにサポートされてい
java.util.Hashtable
ます。の一般契約
hashCode
は次のとおりです。
Javaアプリケーションの実行中に同じオブジェクトで2回以上呼び出される場合、オブジェクトの等値比較で使用される情報が変更されてい
hashCode
なければ、メソッドは常に同じ整数を返す必要があります。この整数は、アプリケーションのある実行から同じアプリケーションの別の実行まで一貫性を保つ必要はありません。
equals(Object)
メソッドに従って2つのオブジェクトが等しい場合、2つのオブジェクトのhashCode
それぞれでメソッドを呼び出すと、同じ整数の結果が生成される必要があります。されていない 2つのオブジェクトに応じて等しくない場合に必要な
equals(java.lang.Object)
メソッドは、呼び出しhashCode
異なる整数結果を生成しなければならない二つの物体のそれぞれに方法を。ただし、プログラマは、異なるオブジェクトに対して異なる整数の結果を生成すると、ハッシュテーブルのパフォーマンスが向上する可能性があることに注意する必要があります。合理的に実用的である限り、クラスObjectによって定義されたhashCodeメソッドは、個別のオブジェクトに対して個別の整数を返します。(これは通常、オブジェクトの内部アドレスを整数に変換することによって実装されますが、この実装手法はJavaプログラミング言語では必要ありません。)
によって返される値
hashCode()
は、オブジェクトのハッシュコードです。これは、16進数のオブジェクトのメモリアドレスです。定義により、2つのオブジェクトが等しい場合、それらのハッシュコードも等しくなければなりません。
equals()
メソッドをオーバーライドすると、2つのオブジェクトが同等と見なされ、Objectの実装が無効になる方法が変更されhashCode()
ます。したがって、equals()メソッドをオーバーライドする場合は、hashCode()
メソッドもオーバーライドする必要があります。
ハッシュコードはあなたのビジネスロジックとは何の関係もありませんが、ほとんどの場合それを処理する必要があります。オブジェクトがハッシュベースのコンテナー(HashSet、HashMap ...)に配置されると、コンテナーは要素のハッシュコードを配置または取得するためです。
ハッシュコードは、任意のオブジェクトから生成された番号です。
これにより、オブジェクトをハッシュテーブルにすばやく格納/取得できます。
次の簡単な例を想像してみてください。
目の前のテーブルの上。それぞれに1から9までの番号が付いた9つのボックスがあります。これらのボックスに格納する非常に異なるオブジェクトの山もありますが、いったんそこに入ると、できるだけ早くそれらを見つけることができる必要があります。
必要なのは、各オブジェクトを配置したボックスを即座に決定する方法です。これは、インデックスのように機能します。キャベツを見つけることに決めたので、キャベツが入っている箱を調べ、その箱に直行してそれを手に入れます。
インデックスに煩わされたくない場合は、オブジェクトが存在するボックスをオブジェクトからすぐに見つけられるようにしたいとします。
例では、これを行う非常に簡単な方法を使用しましょう-オブジェクトの名前の文字数。したがって、キャベツはボックス7、エンドウ豆はボックス3、ロケットはボックス6、バンジョーはボックス5のようになります。
サイはどうですか?10文字なので、アルゴリズムを少し変更して「折り返し」し、10文字のオブジェクトをボックス1に入れ、11文字をボックス2に入れるというようにします。それはあらゆるオブジェクトをカバーするはずです。
箱には複数のオブジェクトが含まれる場合がありますが、ロケットを探している場合は、キャベツ、エンドウ豆、バンジョー、サイの山全体を確認するよりも、ピーナッツとロケットを比較する方がはるかに高速です。
それはハッシュコードです。オブジェクトから数値を取得してHashtableに格納できるようにする方法。Javaでは、ハッシュコードは任意の整数にすることができ、各オブジェクトタイプは独自のコードを生成します。Objectの「hashCode」メソッドを検索します。
ソース- ここに
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));
}
hashCode()
あるユニークなすべてのオブジェクトを作成するためのJVMによって生成されるコードは。
hashCode()
Hashtable、Hashmapなどのハッシュ関連のアルゴリズムで何らかの操作を実行するために使用します。
hashCode()
一意のコードを持つオブジェクトを検索するときに、そのオブジェクトを見つけるのに役立つため、検索操作が簡単になるという利点があります。
しかしhashCode()
、オブジェクトのアドレスであるとは言えません。これは、JVMがオブジェクトごとに生成する一意のコードです。
そのため、現在、ハッシュアルゴリズムが最も人気のある検索アルゴリズムです。