Jakie jest zastosowanie hashCode w Javie?


Odpowiedzi:


222

hashCode()służy do bucketing w Hashimplementacjach 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.


28
Cześć, kolego. Bardzo dobra odpowiedź, ale znalazłem bardzo interesujący link do tego samego z łatwym do zrozumienia praktycznym przykładem: coderanch.com/t/321515/java/java/HashCode
Logicalj

Dziękuję Aishu. Teraz mam jasną wiedzę na temat kodu skrótu z wyjaśnieniem związanym z zasobnikiem.
Balasubramani

2
„jeśli w tym samym zasobniku znajduje się więcej niż 1 element… to używa on 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ę?
Saorikido

Pomijając zasobniki, hashcode to metoda wywoływana przez obiekt w celu określenia kolejności przechowywania każdego obiektu w pamięci. Jeśli obiekty są równe, ich kod skrótu również musi być równy. (odwrotność tego stwierdzenia jest fałszywa)
NoName

1
W jakim przypadku programista mógłby ręcznie wywołać hashCode()metodę?
Kardynał - Przywróć Monikę

33

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 hashCodeto:

  • Za każdym razem, gdy jest wywoływana na tym samym obiekcie więcej niż jeden raz podczas wykonywania aplikacji Java, hashCodemetoda 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łanie hashCodemetody 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łanie hashCodemetody 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).


14

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 Object hashCode()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


13

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 hashCodemodulo 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ć.


6

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.


Nie, nie ma. Wkłada / pobiera klucz. HashCode jest używany tylko do bucketingu,
Marquis of Lorne

3

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


-1

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));
}

Co oznacza „budowanie mechanizmu wyłapującego”? Jak ilustruje to ten kod?
Markiz Lorne

-1

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.


4
Hashcode nie jest unikalny. 2 nierówne obiekty mogą zwrócić ten sam kod skrótu.
Ranielle Canlas
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.