Klíčový rozdíl – rovná se vs hashCode v Javě
Operátor se rovná je podobný operátoru==, který má testovat identitu objektu spíše než rovnost objektu. HashCode je metoda, pomocí které třída implicitně nebo explicitně rozděluje data uložená v instanci třídy na jedinou hodnotu hash, což je 32bitové celé číslo se znaménkem. Klíčový rozdíl mezi rovná se a hashCode v Javě je ten, že se rovná se používá k porovnání dvou objektů, zatímco hashCode se používá při hašování k rozhodnutí, do které skupiny by měl být objekt kategorizován.
Co se rovná v Javě?
Metoda se rovná se používá k porovnání dvou objektů. Výchozí metoda se rovná je definována ve třídě objektů. Tato implementace je podobná operátoru==. Dva odkazy na objekt jsou si rovny, pouze pokud směřují na stejný objekt. Je možné přepsat metodu rovná se.
Obrázek 01: Program Java se rovná se
Příkaz System.out.println(s1.equals(s2)) dá odpověď false, protože s1 a s2 odkazují na dva různé objekty. Bylo to podobné příkazu System.out.println(s1==s2);
Příkaz System.out.println(s1.equals(s3)) dá odpověď pravdivou, protože s1 a s3 odkazují na stejný objekt. Bylo to podobné prohlášení, System.out.println(s1==s3);
Ve třídě Student neexistuje žádná metoda rovná se. Proto se ve třídě Object nazývá rovná se. True se zobrazí pouze v případě, že odkaz na objekt ukazuje na stejný objekt.
Obrázek 02: Java Program s přepsáním se rovná
Podle výše uvedeného programu je metoda rovná se přepsána. Objekt je předán metodě a je přetypován na Student. Poté se zkontrolují hodnoty id. Pokud jsou hodnoty id podobné, vrátí hodnotu true. Pokud ne, vrátí hodnotu false. ID s1 a s2 jsou podobná. Takže se vytiskne pravda. ID s1 a s3 jsou také podobná, takže se vytiskne true.
Co je hashCode v Javě?
HashCode se používá při hašování k rozhodnutí, do které skupiny by měl být objekt zařazen. Skupina objektů může sdílet stejný hashCode. Správná hašovací funkce může rovnoměrně rozdělit objekty do různých skupin.
Správný hashCode může mít následující vlastnosti. Předpokládejme, že existují dva objekty jako obj1 a obj2. Pokud má obj1.equals(obj2) hodnotu true, pak se obj1.hashCode() rovná obj2.hashCode(). Pokud je obj1.equals(obj2) nepravda, není nutné, aby obj1.hashCode() nebylo rovno obj2.hashCode(). Dva nestejné objekty mohou mít také stejný hashCode.
Obrázek 03: Studentská třída s rovná se a hashCode
Obrázek 04: Hlavní program
Třída Student obsahuje metody rovná se a hashCode. Metoda rovná se ve třídě Student obdrží objekt. Pokud je objekt null, vrátí hodnotu false. Pokud třídy objektů nejsou stejné, vrátí hodnotu false. Hodnoty id jsou kontrolovány v obou objektech. Pokud jsou podobné, vrátí se true. Jinak vrátí false.
V hlavním programu se vytvoří objekty s1 a s2. Při volání s1.equals(s2) dá hodnotu true, protože metoda equals je přepsána a kontroluje hodnoty id dvou objektů. I když odkazují na dva objekty, odpověď je pravdivá, protože hodnoty id s1 a s2 jsou stejné. Protože s1.equals(s2) je pravdivé, hashCode s1 a s2 by se měl rovnat. Tisk hashCode s1 a s2 dává stejnou hodnotu. Metodu hashCode lze použít s kolekcemi, jako je HashMap.
Jaký je rozdíl mezi equals a hashCode v Javě?
rovná se vs hashCode v Javě |
|
equals je metoda v Javě, která funguje podobně jako operátor==, který má testovat identitu objektu spíše než rovnost objektu. | hashCode je metoda, pomocí které třída implicitně nebo explicitně rozděluje data uložená v instanci třídy na jedinou hodnotu hash. |
Použití | |
Metoda se rovná se používá k porovnání dvou objektů. | Metoda se používá při hašování k rozhodnutí, do které skupiny by měl být objekt umístěn. |
Shrnutí – rovná se vs hashCode v Javě
Rozdíl mezi rovná se a hashCode v Javě je ten, že se rovná se používá k porovnání dvou objektů, zatímco hashCode se používá při hašování k rozhodnutí, do které skupiny by měl být objekt zařazen.