Zastosowanie equals() i hashCode();

0

Chciałem się dowiedzieć co to wykonuje metoda equals() i hashCode(); po co się ją stosuje. Jestem początkujący.

      public Integer Id;
	
	public OD (Integer Id)
	{
		super();
		this.Id = Id;
	}
	

	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		OD other = (OD) obj;
		if (Id == null) {
			if (other.Id != null)
				return false;
		} else if (!Id.equals(other.Id))
			return false;
		return true;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((Id == null) ? 0 : Id.hashCode());
		return result;
	}
  • wstawiłem kod w <code> - msm *
0

hashCode() jest np wykorzystywane w HashMapie. equals() jest wykorzystywane bardzo często, do sprawdzenia identyczności obiektów. Jeśli mamy dwie referencje do obiektów to operator == sprawdza czy wskazują one na ten sam obiekt, natomiast metoda equals() powinna sprawdzić czy wskazywane obiekty są sobie równe (w jakimś tam ustalonym sensie) - w szczególności jeśli operator == zwraca true, to equals() też powinno zwrócić true i jeżeli equals() zwraca false, to operator == też powinien zwrócić false.

0

A co wykonuje ten mój HashCode() bo equal czaje?

0

http://pl.wikipedia.org/wiki/Funkcja_skr%C3%B3tu
W zasadzie można powiedzieć, że hashCode kompresuje stratnie obiekt do jednego inta. W Javadocu do hashCode jest opisany kontrakt, który musi spełnić hashCode, aby był poprawny.

0

Dzięki za pomoc.

1

Hash: W największym skrócie żeby dostać się do jakiejś wartości, to wystarczy wszystkie takie posortowane wartości umieścić w tablicy. Dzięki temu znając indeks mamy cały obiekt kosztem zaledwie jednego dodawania indeksu do jej początku. Ktoś wykombinował, że przecież wszystko da się zamienić na indeks, a więc każdy rodzaj danych może być tak błyskawicznie uzyskiwany. Kod hash jest właśnie zamianą dowolnego zestawu danych na taki 32-bitowy indeks. Używanie jednak tablicy o wielkości zakresu integer jest zwykle niepraktyczne (2-4 miliardy elementów to trochę dużo), więc robi się tablice znacznie mniejsze, a indeksy będące hashami "zakręca" się wokół jej rozmiaru. To jednak oznacza, że pod konkretnym indeksem może znaleźć się więcej niż jedna wartość. Dlatego tablica taka musi zamiast przechowywania pojedynczych obiektów przechowywać ich listy. Ponieważ przy równomiernym rozkładzie indeksów takie listy są bardzo krótkie i zajmują tylko kilka pozycji, więc po indeksowaniu po prostu przeszukuje się taka listę i porównuje z tym czego się szukało (najpierw "niezawinięte" hashe (optymalizacja), a jeżeli to nie rozstrzygnie, to całe obiekty). Koszt przeszukanie kilku pozycji jest i tak rzędy wielkości mniej kosztowne niż gdyby trzeba było przeszukiwać i porównywać całą listę złożoną z tysięcy lub milionów elementów.
Dodatkowo najnowsze implementacje działają tak, że wielkość tablicy jest wielokrotnością 2, dzięki czemu indeksowanie sprowadza się do pojedynczej operacji AND z maską. Krótko mówiąc jest to bardzo szybki kontener na dane, które są dostępne prawie natychmiastowo. Obecnie zamiast tablic używa się mapy, czyli kontenery przechowujące parę klucz i wartość. W niektórych językach taka mapa jest podstawą przechowywania danych - np. PHP ma tylko typ tablicowy, który jest niczym innym jak hash mapą z uporządkowaną listą kluczy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1