W Javie obj.hashCode()
zwraca pewną wartość. Jakie jest zastosowanie tego kodu skrótu w programowaniu?
W Javie obj.hashCode()
zwraca pewną wartość. Jakie jest zastosowanie tego kodu skrótu w programowaniu?
Odpowiedzi:
hashCode()
służy do bucketing w Hash
implementacjach podoba HashMap
, HashTable
, HashSet
, itd.
Wartość otrzymana z hashCode()
służy jako numer wiadra do przechowywania elementów zestawu / mapy. Ten numer segmentu to adres elementu w zestawie / mapie.
Kiedy to zrobisz contains()
, weźmiesz kod skrótu elementu, a następnie poszukaj zasobnika, na który wskazuje kod skrótu. Jeśli w tym samym zasobniku znajduje się więcej niż 1 element (wiele obiektów może mieć ten sam kod skrótu), to używa equals()
metody do oceny, czy obiekty są równe, a następnie decyduje, czy contains()
jest to prawda, czy fałsz, lub decyduje, czy element może być dodany w zestawie lub nie.
equals()
do oceny”, więc co, jeśli zostanie znaleziony tylko jeden element dopasowany do kodu skrótu, zwraca on bezpośrednio wartość true? ale ponieważ wiele obiektów może mieć ten sam kod skrótu, więc musi zostać uruchomiony, equals()
aby ocenić, czy dopasowany element jest równy, w przeciwnym razie może dać nieoczekiwany wynik, mam rację?
hashCode()
metodę?
Z Javadoc :
Zwraca wartość kodu skrótu dla obiektu. Ta metoda jest obsługiwana na korzyść tabel skrótów, takich jak te dostarczane przez
java.util.Hashtable
.Umowa ogólna
hashCode
to:
Za każdym razem, gdy jest wywoływana na tym samym obiekcie więcej niż jeden raz podczas wykonywania aplikacji Java,
hashCode
metoda musi konsekwentnie zwracać tę samą liczbę całkowitą , pod warunkiem, że nie zostaną zmodyfikowane żadne informacje użyte w porównaniach równości na obiekcie. Ta liczba całkowita nie musi pozostawać spójna od jednego wykonania aplikacji do innego wykonania tej samej aplikacji.Jeśli dwa obiekty są równe zgodnie z
equals(Object)
metodą, wywołaniehashCode
metody na każdym z dwóch obiektów musi dać ten sam wynik w postaci liczby całkowitej.Jest to nie wymaga się, jeżeli dwa obiekty są nierówne, zgodnie z
equals(java.lang.Object)
metodą, to wywołaniehashCode
metody w każdym z tych dwóch przedmiotów musi wytwarzać różne wyniki całkowite. Jednak programista powinien być świadomy, że tworzenie różnych wyników całkowitych dla nierównych obiektów może poprawić wydajność tablic mieszających.O ile jest to rozsądnie praktyczne, metoda hashCode zdefiniowana przez klasę Object zwraca różne liczby całkowite dla różnych obiektów. (Zazwyczaj jest to realizowane przez konwersję adresu wewnętrznego obiektu na liczbę całkowitą , ale ta technika implementacji nie jest wymagana przez język programowania Java).
Wartość zwracana przez
hashCode()
to kod skrótu obiektu, który jest adresem pamięci obiektu w postaci szesnastkowej.Z definicji, jeśli dwa obiekty są równe, ich kod skrótu również musi być równy. Jeśli zmienisz
equals()
metodę, zmienisz sposób zrównania dwóch obiektów i implementacja ObjecthashCode()
nie jest już poprawna. Dlatego w przypadku przesłonięcia metody equals () należy również nadpisaćhashCode()
metodę.
Ta odpowiedź pochodzi z oficjalnej dokumentacji samouczka java SE 8
hashCode()
jest funkcją, która przyjmuje obiekt i wyprowadza wartość liczbową. Kod skrótu obiektu jest zawsze taki sam, jeśli obiekt się nie zmienia.
Funkcje takie jak HashMap
, HashTable
, HashSet
, itd., Które trzeba przechowywać przedmiotów użyje hashCode
modulo rozmiaru ich wewnętrznej tablicy wybierać w co „pozycja pamięci” (czyli pozycja tablica) do przechowywania przedmiotów.
Istnieją przypadki, w których mogą wystąpić kolizje (dwa obiekty kończą się tym samym hashcode) i oczywiście należy to ostrożnie rozwiązać.
Chociaż hashcode nic nie robi z logiką biznesową, w większości przypadków musimy się nim zająć. Ponieważ kiedy twój obiekt jest umieszczany w kontenerze opartym na skrócie (HashSet, HashMap ...), kontener umieszcza / pobiera hashcode elementu.
Hashcode jest liczbą generowane z dowolnego przedmiotu.
To właśnie pozwala na szybkie przechowywanie / pobieranie obiektów w tablicy z haszowaniem.
Wyobraź sobie następujący prosty przykład :
Na stole przed tobą. masz dziewięć pudeł, każde oznaczone cyframi od 1 do 9. Masz również stos bardzo różnych przedmiotów do przechowywania w tych pudełkach, ale kiedy już się tam znajdą, musisz je znaleźć tak szybko, jak to możliwe.
Potrzebujesz sposobu na natychmiastowe zdecydowanie, w którym polu umieścisz każdy obiekt. Działa jak indeks. decydujesz się znaleźć kapustę, więc sprawdzasz, w którym pudełku jest kapusta, a następnie idź prosto do tego pudełka, aby ją zdobyć.
Teraz wyobraź sobie, że nie chcesz zawracać sobie głowy indeksem, chcesz móc od razu dowiedzieć się z obiektu, w którym pudełku się on znajduje.
W tym przykładzie skorzystajmy z naprawdę prostego sposobu - liczby liter w nazwie obiektu. Więc kapusta idzie do pudełka 7, groch do pudełka 3, rukola do pudełka 6, banjo do pudełka 5 i tak dalej.
A co z nosorożcami? Ma 10 znaków, więc zmienimy nieco nasz algorytm i "zawiniemy" tak, aby 10-literowe obiekty trafiały do pola 1, 11 liter w polu 2 i tak dalej. Powinno to obejmować każdy przedmiot.
Czasami pudełko będzie zawierało więcej niż jeden przedmiot, ale jeśli szukasz rakiety, nadal znacznie szybciej jest porównać orzeszek ziemny i rakietę, niż sprawdzić cały stos kapusty, grochu, banjos i nosorożców.
To jest kod skrótu. Sposób uzyskiwania liczby z obiektu, aby można ją było przechowywać w tablicy z haszowaniem. W Javie kod skrótu może być dowolną liczbą całkowitą, a każdy typ obiektu jest odpowiedzialny za wygenerowanie własnego. Wyszukaj metodę „hashCode” obiektu.
Źródło - tutaj
Jednym z zastosowań metody hashCode () jest budowanie mechanizmu Catching . Spójrz na ten przykład:
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()
to unikalny kod generowany przez maszynę JVM dla każdego utworzonego obiektu.
Używamy hashCode()
do wykonywania pewnych operacji na algorytmach związanych z haszowaniem, takich jak Hashtable, Hashmap itp.
Zalety hashCode()
ułatwiają operację wyszukiwania, ponieważ gdy szukamy obiektu, który ma unikalny kod, pomaga to znaleźć.
Ale nie możemy powiedzieć, że hashCode()
jest to adres przedmiotu. Jest to unikalny kod generowany przez JVM dla każdego obiektu.
Dlatego obecnie najpopularniejszym algorytmem wyszukiwania jest algorytm haszujący.