Datové typy: primitivní, objektové, pole. Výrazy. Obsah Úvod k datovým typům v Jávě.......................................................................................2 Primitivní vs. objektové datové typy - opakování ......................................................................2 Přiřazení proměnné primitivního typu - opakování.....................................................................2 Přiřazení objektové proměnné - opakování...............................................................................2 Primitivní datové typy..................................................................................................3 Primitivní datové typy..........................................................................................................3 Integrální typy - celočíselné ..................................................................................................4 Integrální typy - "char".........................................................................................................5 Typ charWlKIPFMA -kódování ......................................................................................5 Tlir kn-i- Fil i. Ljvibi Čísla s pohyblivou řádovou čárkou .........................................................................................6 Vestavěné konstanty s pohyblivou řádovou čárkou ....................................................................6 Typ logických hodnot - boolean.............................................................................................7 Typ voidWlKIPRMA .....................................................................................................7 TJir FVi-i- Fil i. Ljv-iLm Pole..........................................................................................................................7 Pole v Jávě ........................................................................................................................7 Pole (2) .............................................................................................................................8 Pole - co když deklarujeme, ale nevytvoříme?...........................................................................9 Pole - co když deklarujeme, vytvoříme, ale nenaplníme? ............................................................9 Kopírování polí ................................................................................................................10 Operátory a výrazy ....................................................................................................10 Aritmetické......................................................................................................................11 Logické...........................................................................................................................11 Relační (porovnávací) ........................................................................................................12 Bitové.............................................................................................................................12 Operátor podmíněného výrazu ? : Wl ĽIPRlJl A ..................................................................13 li p rni1 r li. i. Ln "ik ■ Operátory typové konverze (pretypovaní) ..............................................................................13 Operátor zřetězení+WlKIPEfllA ......................................................................................14 Priority operátorů a vytváření výrazů ....................................................................................14 Porovnávání objektů..................................................................................................14 Relační (porovnávací) ........................................................................................................15 Porovnávání objektů..........................................................................................................15 Porovnávání objektů - příklad..............................................................................................16 Metoda hashCode..............................................................................................................16 Metoda hashCode - příklad .................................................................................................17 1 Datové typy: primitivní, objektové, pole. Výrazy. Úvod k datovým typům v Jávě Cíl Naučit se pracovat s primitivními a objektovými datovými typy v Jávě, vymezit to vůči obecně známým principům (např. z Pascalu) Předpoklady Znát základní datové typy (číselné, logické, znakové) - např. z Pascalu • Primitivní vs. objektové typy • Kategorie primitivních typů: integrální, boolean, čísla s pohyblivou řádovou čárkou • Pole: deklarace, vytvoření, naplnění, přístup k prvkům, rozsah indexů Primitivní vs. objektové datové typy - opakování Java striktně rozlišuje mezi hodnotami • primitivních datových typů (čísla, logické hodnoty, znaky) a • objektových typů (řetězce a všechny uživatelem definované [tj. vlastní] typy-třídy) Základní rozdíl je v práci s proměnnými: proměnné primitivních typů přímo obsahují danou hodnotu, zatímco proměnné objektových typů obsahují pouze odkaz na příslušný objekt Důsledek -> dvě objektové proměnné mohou nést odkaz na tentýž objekt Přiřazení proměnné primitivního typu - opakování • Příklad: double a = 1.23456; double b = a; a += 2; Přiřazení objektové proměnné - opakování • Příklad, deklarujeme třídu Counter WlKlPFDlA "íkr ľni- Fil i. LjiiLi 2 Datové typy: primitivní, objektové, pole. Výrazy. [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=Counter]takto: public class Counter { private double value; public Counter(double v) { value = v; } public void add(double v) { value += v; } public void show() { System.out.println(value); } nyní ji použijeme: Counter cl Counter c2 cl.add(2) ; cl.show(); c2.show(); dostaneme: 3.23456 3.23456 Primitivní datové typy Primitivní datové typy Proměnné těchto typů nesou elementární, z hlediska Javy atomické, dále nestrukturované hodnoty. Deklarace takové proměnné (kdekoli) způsobí: 1. rezervování příslušného paměťového prostoru (např. pro hodnotu intWlfCIPEfllA flip pni1 Fil i. bniki [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=int] čtyři bajty) 2. zpřístupnění (pojmenování) tohoto prostoru identifikátorem proměnné V Jávě existují tyto skupiny primitivních typů: = new Counter(1.23456); = cl; 3 Datové typy: primitivní, objektové, pole. Výrazy. 1. integrální typy (obdoba ordinálních typů v Pascalu) - zahrnují typy celočíselné (byte WlICir-FDlA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=byte], "Tlir ľni- Fil i. L-ja-iki shortWlKlPEDlA Tli r r n i ■ r 11 i. Ľ ■ ■ iL i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=short], int WlťlPFDlA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=int] a Tli r rni1 Fil i. L-aaih i longWlKIPFDlA TFír FriT Fil i. ľbbibi [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=long]) a typ char WlKIPFrilA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=char]; Tri r rni1 Fil ■. !, <=, >=. Typ voidľ^'ľľ [http://cs.wikipedia.Org/wiki/Speci%C3%A1ln%C3%AD:S earch?search=void] Význam podobný jako v C/C++. Není v pravém slova smyslu datovým typem, nemá žádné hodnoty. Označuje "prázdný" typ pro sdělení, že určitá metoda nevrací žádný výsledek. Pole Pole v Jávě Pole v Jávě je speciálním objektem Můžeme mít pole jak primitivních, tak objektových hodnot • pole primitivních hodnot tyto hodnoty obsahuje • pole objektů obsahuje odkazy na objekty Kromě pole v Jávě existují i jiné objekty na ukládání více hodnot - tzn. kontejnery, viz dále Syntaxe deklarace typhodnoty [] jménopoleWUflPFillA ľi r pnT riL i. l-iinh i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=typhodnoty [] jménopole] Poznámka na rozdíl od C/C++ nikdy neuvádíme při deklaraci počet prvků pole - ten je podstatný až při vytvoření objektu pole 7 Datové typy: primitivní, objektové, pole. Výrazy. Syntaxe přístupu k prvkfmyménopolefindexprvkuJPoužŕváme • jak pro přiřazení prvku do pole: jménopole [indexprvku] = hodnota; WltiIPF.iJlA Ur Fni- Fib i. Lfviki [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search= jménopole [indexprvku] = hodnota;] tak pro čtení hodnoty z pole proměnná = jménopole [indexprvku] ;WlKIPEfllA Dip rm- Fil u L-j»bi [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search= proměnná = jménopole [indexprvku];] Syntaxe vytvoření objektu pole: jako u jiného objektu - voláním konstruktoru: jménopole = new typhodnotyf početprvků ]; nebo vzniklé pole rovnou naplníme hodnotami/odkazy jménopole = new typhodnotyW {prvekl, prvek2,...}; Pole (2) Poleje objekt, je třeba ho před použitím nejen deklarovat, ale i vytvořit: Person[] lidi; lidi = new Person[5]; Clove kVťlICIPRillA Ti f tni- Fil i. Mir i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=Clovek] Nyní můžeme pole naplnit: lidi[0] = new Person("Václav Klaus"); lidi[l] = new Person("Libuše Benešová"); lidi[0].writelnfo(); lidi[1].writelnfo(); • Nyní jsou v poli lidiWlKIPEMA ílir tni1 Fil u Lniki [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=lidi] naplněny první dva prvky odkazy na objekty. • Zbylé prvky zůstaly naplněny prázdnými odkazy nullWlKIPEDlA ílir p m- pil i. L nik ■ [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=null]. Datové typy: primitivní, objektové, pole. Výrazy. Pole - co když deklarujeme, ale nevytvoříme? Co kdybychom pole pouze deklarovali a nevytvořili: Person[] lidi; lidi[0] = new Person("Václav Klaus"); Toto by skončilo s běhovou chybou "NullPointerException", pole neexistuje, nelze do něj tudíž vkládat prvky! Pokud tuto chybu uděláme v rámci metody: public class Pokus { public static void main(String args[]) { String[] pole; pole[0] = "Neco"; } } překladač nás varuje: Pokus.java:4: variable pole might not have been initialized pole[0] = "Neco"; A 1 error Pokud ovšem poleWlKIPFhlA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=pole] Hli r priT ml i. ĽBini i bude proměnnou objektu/třídy: public class Pokus { static String[] pole; public static void main(String args[]) { pole[0] = "Neco"; } } Překladač chybu neodhalí a po spuštění se objeví: Exception in thread "main" java.lang.NullPointerException at Pokus.main(Pokus.java:4) Pole - co když deklarujeme, vytvoříme, ale nenaplníme? Co kdybychom pole deklarovali, vytvořili, ale nenaplnili příslušnými prvky: Person[] lidi; 9 Datové typy: primitivní, objektové, pole. Výrazy. lidi = new Person[5]; lidi[0].writelnfo(); Toto by skončilo také s běhovou chybou NullPointerException: • pole existuje, má pět prvků, ale první z nich je prázdný, nelze tudíž volat jeho metody (resp. vůbec používat jeho vlastnosti)! Kopírování polí V Jávě obecně přiřazení proměnné objektového typu vede pouze k duplikaci odkazu, nikoli celého odkazovaného objektu. Nejinak je tomu u polí, tj.: Person[] lidi2; lidi2 = lidil; V proměnné//rň2je nyní odkaz na stejné pole jako je y lidil. Zatímco, provedeme-li vytvoření nového pole + arraycopy, pak lidi2 obsahuje duplikát/klon/kopii původního pole. Person[] lidi2 = new Person[5]; System.arraycopy(lidi, 0, lidi2, 0, lidi.length); viz též Dokumentace API třídy "System" [http://java.sun.eom/j2se/l.4/docs/api/java/lang/System.html] Poznámka Samozřejmě bychom mohli kopírovat prvky ručně, např. pomocí forWiKIPEIllA li r r n i ■ pil i . u ■ ■ i W ■ [http ://cs. wikipedia. org/wiki/Speci%C3 %A 1 ln%C3 %AD: Search? search=for] cyklu, ale volání System.arraycopy je zaručeně nejrychlejší a přitom stále platformově nezávislou metodou, jak kopírovat pole. Také arraycopy však do cílového pole zduplikuje jen odkazy na objekty, nevytvoří kopie objektů! Operátory a výrazy Cíl Zvládnout použití operátorů v Jávě a naučit se sestavovat výrazy různých typů Předpoklady Znát obecné principy syntaxe a vyhodnocování výrazů v pg. jazycích (např. Pascalu) 10 Datové typy: primitivní, objektové, pole. Výrazy. • Operátory v Jávě: aritmetické, logické, relační, bitové Ternární operátor podmíněného výrazu Typové konverze Operátor zřetězení Aritmetické +WIKIPFMA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=+], Tip r*n-i- rn. ■. Ln-iL ■ WlTCIPFMA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=-], * Píp tni" Fík ■■ 1-ainr i WlKIPFMA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=*], / Ti p p n t rib i. Lnib ■ W.KII'HílA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=/] a % Ti r Fni" Fift u bniki WlKlPFhlA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=%] (zbytek po Ikr ľni' Fia ■ L-^a-iL i celočíselném dělení) Pozn: operátor dělení /je polymorfní, funguje pro celočíselné argumenty jako celočíselný, pro floatingpoint (float, double) jako "obyčejný". Logické Pracují nad logickými (booleovskými) hodnotami (samozřejmě vč. výsledků porovnávání <, >, ==, atd.). logické součiny (AND): • & WlKIPFMA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=&](«e- ľhr tni1 ŕ i ii u Lniki podmíněný - vždy se vyhodnotí oba operandy), • && WlKIPFľllA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search= && ] Ti p pni" riL i. L ni U ■ {podmíněný - líné vyhodnocování - druhý operand se vyhodnotí, jen nelze-li o výsledku rozhodnout z hodnoty prvního) logické součty (OR): • | WlVIPEDlA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search= | ] {ne- Trip pni1 Fík i. Lni b i podmíněný - vždy se vyhodnotí oba operandy), • | | WlTCIPFrilA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search= || ] TTir kn-i- Fík ■■ L^a-ik ■ {podmíněný - líné vyhodnocování - druhý operand se vyhodnotí, jen nelze-li o výsledku rozhodnout z hodnoty prvního) 11 Datové typy: primitivní, objektové, pole. Výrazy. negace (NOT): • ! WIKIPFMA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search= ! ] Tli r rni- p íl i. LniLi Relační (porovnávací) Tyto lze použít na porovnávání primitivních hodnot: • < WlKIPFMA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=<], <= Hir r'n-i- Fil i. L-»-iL i WlKlPFMA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search= <= ], >= Tli p ppn" pil ■■ Lnibi WlVlPFMA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search= >= ], > "Tlir p'n-i- pil ■_ L-h-iL i WlKlPFMA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search= > ] íllP PPH" PIL I. 1'BB^h 1 Test na rovnost/nerovnost lze použít na porovnávání primitivních hodnot i objektů: • == WlKlPFDlA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search= == ], "Ipir Fni- Fil i. Lrnik ■ != WltlPFDlA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search= !=] Trir rni- Fil i. unikl Upozornění: • Pozor na porovnávání objektů: == vrací true jen při rovnosti odkazů, tj. jsou-li objekty identické. Rovnost obsahu (tedy "rovnocennost") objektů se zjišťuje voláním metody ol.equals(Object o2) • Pozor na srovnávání floating-points čísel na rovnost: je třeba počítat s chybami zaokrouhlení; místo porovnání na přesnou rovnost raději používejme jistou toleranci: abs(expected-actual) < delta Bitové Bitové: • součin & WlKlPFÍJlA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search= Dir hni- Fn i.lfiih &] • součet | WltlPFľllA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search= | ľlír F ni1 Fil i. unik ■ ] • exkluzivní součet (XOR) A WlKlPFÍllA Tnr F ni1 Fib i. bnifei 12 Datové typy: primitivní, objektové, pole. Výrazy. [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search= A ] (znak "stříška") • negace (bitwise-NOT) ~ WHCIPFFHA Tli r hni- Fík ■■ L-aink i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search= ~ ] (znak "tilda") - obrátí bity argumentu a výsledek vrátí Posuny: • vlevo «WIKIPF.MA íli r priT pil i. Laank i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=«] o stanovený počet bitů • vpravo »WlKIPFMA li" pna" pil i. l-aiah i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=»] o stanovený počet bitů s respektováním znaménka • vpravo >»WlKlPFhlA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=»>] o stanovený počet bitů bez respektování znaménka Dále viz např. Bitové operátory [http://www.fi.muni.cz/~tomp/java/ucebnice/javasrc/tomp/ucebnice/operatory/Bitove.java] Operátor podmíněného výrazu ? :?™™í [http://cs.wikipedia.Org/wiki/Speci%C3%A1ln%C3%AD:S earch?search=? :] Jediný ternární operátor, navíc polymorfní, pracuje nad různými typy 2. a 3. argumentu. Platí-li první operand (má hodnotu trueWlfCIPFTJlA íli r pna1 r li. i. LnaLi [http://cs.wikipedia.org/wiki/Speci%C3%A 1 ln%C3%AD: Search?search=trae]) -> • výsledkem je hodnota drahého operandu • jinak je výsledkem hodnota třetího operandu Typ prvního operandu musí být booleanWlfCIPFľJlA ill r pna1 pik i. LnaBi [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=boolean], typy drahého a třetího musí být přiřaditelné do výsledku. Operátory typové konverze (pretypovaní) 13 Datové typy: primitivní, objektové, pole. Výrazy. • Podobně jako v C/C++ • Píše se (typ)hodnota, např. (Person)o, kde o byla proměnná deklarovaná jako Object. Pro objektové typy se ve skutečnosti nejedná o žádnou konverzi spojenou se změnou obsahu objektu, nýbrž pouze o potvrzení (tj. typovou kontrolu), že běhový typ objektu je požadovaného typu - např. (viz výše) že o je typu Person. • Naproti tomu u primitivních typů se jedná o úpravu hodnoty - např. int pretypujeme na short a „ořeže" se tím rozsah. Operátor zřetězení +B™!Í [http://cs.wikipedia.Org/wiki/Speci%C3%A1ln%C3%AD:S earch?search=+] Výsledkem je vždy řetězec, ale argumenty mohou být i jiných typů, např. sekvence int i = 1; System, out. println ("proměnna i="+i) ; WlKIPFDiA Tnr p ni1 pil i. LbbiLi [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=int i = 1; Sys-temout.println("promenna i="+i);] je v pořádku s řetězcovou konstantou se spojí řetězcová podoba dalších argumentů (např. čísla). Pokud je argumentem zřetězení odkaz na objekt o WlKJPFDlA flir rni1 Fib i. Lniii [http://cs.wikipedia.org/wiki/Speci%C3%A 1 ln%C3%AD: Search?search=o ] -> • jeli o == nullWmPFMA TTip k pit Fib h Lni^i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=o == null] -> použije se řetězec "nulľ'WlKIPF.illA Ihr hni- Fib h Lbibbu [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search="null"] • je-li o ! = nul lWlKIPFľllA ill P P PIT Plk I. LbBhLi [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=o != null] -> použije se hodnota vrácená metodou o. toString () WlĽIPFIllA TV, F„,- F.. . L^nL, [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=o.toString()] (tu lze překrýt a dosáhnout tak očekávaného řetězcového výstupu) Priority operátorů a vytváření výrazů nejvyšší prioritu má násobení, dělení, nejnižší přiřazení Porovnávání objektů 14 Datové typy: primitivní, objektové, pole. Výrazy. • Porovnávání primitivních hodnot a objektů je zásadně odlišné. • U objektů lze kromě == a != použít metodu equals. Relační (porovnávací) Na objekty nelze použít: • < WlťlPFnrA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=<], <= ílir rni- riL i. L-bbiL i WIKIPRMA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search= <= ], >= "TIip Vni- Fil ■. L-ia-ik i WlKIPRMA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search= >= ], > Trir F"n-i- Fil i. L-bb-iL i WIKIPRMA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search= > ] "TIip Vrtf f trn ■■ L- ^«i k ■ Zatímco test na rovnost/nerovnost lze použít na porovnávání primitivních hodnot i objektů: • == WIKIPEMA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search= == ], flir p m- Fib i. bniBi != WltľlPErilA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search= !=] Hir Fn-i- Fil i. L-^a-iL i Znovu podstatné upozornění: • pozor na porovnávání objektů: == vrací true jen při rovnosti odkazů, tj. jsou-li objekty identické. Rovnost obsahu (tedy "rovnocennost") objektů se zjišťuje voláním metody ol.equals(Object o2) Porovnávání objektů Použití == • Porovnáme-li dva objekty (tzn. odkazy na objekty) prostřednictvím operátoru == dostaneme rovnost jen v případě, jedná-li se o dva odkazy na tentýž objekt - tj. dva totožné objekty. • Jedná-li se o dva obsahově stejné objekty existující samostatně, pak == vrátí false. Chceme-li (intuitivně) chápat rovnost objektů podle obsahu, tj. dva objekty jsou rovné {rovnocenné, nikoli totožné), mají-li stejný obsah, pak • musíme pro danou třídu překrýt metodu equals, která musí vrátit true, právě když se obsah výchozího a srovnávaného objektu rovná. 15 Datové typy: primitivní, objektové, pole. Výrazy. • Fungování equals lze srovnat s porovnáváním dvou databázových záznamů podle primárního klíče. Nepřekryjeme-li equals, funguje původní equals přísným způsobem, tj. rovné si budou jen totožné objekty. Porovnávání objektů - pnklad Příklad: objekt třídy Človek nese informace o člověku. Dva objekty položíme stejné (rovnocenné), ne-sou-li stejná příjmení: Obrázek 1. Dva lidi jsou stejní, mají-li stejná příjmení public class Person implements Comparable { private String firstname, surname; public Person (String j, String p) { firstname = j; surname = p; } public boolean equals(Object o) { if (o instanceof Person) { Person c = (Person)o; // dva lidé se (v našem připadě) rovnaji, maji-li stejná přijmeni return surname.equals(c.surname); } else { // porovnáváme-li osobu s objektem jiného typu, nikdy se nerovnají return false; } } } Méně agresivní verze by nemusela při porovnávání s jiným objektem než Person vyhodit výjimku, pouze vrátit false. Metoda hashCode Jakmile u třídy překryjeme metodu equals, měli bychom současně překrýt objektů i metodu hashCode: • hashCode vrací celé číslo (int) „co nejlépe" charakterizující obsah objektu, tj. • pro dva stejné {equals) objekty musí vždy vrátit stejnou hodnotu. Pro dva obsahově různé objekty by hashCode naopak měl vracet různé hodnoty (ale není to stoprocentně nezbytné a ani nemůže být vždy splněno). 16 Datové typy: primitivní, objektové, pole. Výrazy. Metoda hashCode totiž nemůže vždy být prostá. Metoda hashCode - příklad V těle hashCode s oblibou „přehráváme" (delegujeme) řešení na volání hashCode jednotlivých složek objektu - a to těch, které figurují v equals: Obrázek 2. Třída Človek s metodami equals a hashCode public class Person implements Comparable { private String firstname, surname; public Person (String j, String p) { firstname = j; surname = p; } public boolean equals(Object o) { if (o instanceof Person) { Person c = (Person)o; // dva lidé se (v našem připadě) rovnaji, maji-li stejná přijmeni return surname.equals(c.surname); } else { // porovnáváme-li osobu s objektem jiného typu, nikdy se nerovnají return false; } } public int hashCode() { return surname.hashCode(); } } 17