Re: java.security.Permission
A este si treba pozriet Javadoc k samotnemu objektu java.lang.Object. Tam sa pise o metode hashCode(), ze musi byt implementovana tak aby dva objekty, ktore su equals() musia mat rovnaky hshCode().
Re: java.security.Permission
Dobre, ale potom nechapu proc neni soucasti rodicovske tridy Permission zakladni implementace zalozena treba na metode getName (), tak jako je toho docileno v BasicPermission tride... Ja se chtel jenom zeptat, jestli v tom neni nejakej figl, nebo jestli je to jenom nedomyslenost... - Original Message - From: Jiří Mareš [EMAIL PROTECTED] To: Java konference@java.cz Sent: Thursday, July 27, 2006 7:31 AM Subject: Re: java.security.Permission Ja bych teda pouzil javadoc, kde jsem se vysvetleni dobral naprosto v pohode ... The required hashCode behavior for Permission Objects is the following: * Whenever it is invoked on the same Permission object more than once during an execution of a Java application, the hashCode method must consistently return the same integer. This integer need not remain consistent from one execution of an application to another execution of the same application. * If two Permission objects are equal according to the equals method, then calling the hashCode method on each of the two Permission objects must produce the same integer result. Nevim proc jsou tyto pozadavky, ale jsou. Standardni implementace hashcode vychazi z toho, jak je objekt alokovan, tj. kde v heapu je a proto ma kazda instance jiny hash, zda ho pozaduji mit stejny i napric ruznymi instancemi JVM. Proto si jej musite implementovat sam ... Priste se mrknete do javadoc a pak se ptejte :-) Kamzik-II napsal(a): Hm asi mate v tomhle pravdu :) Jak se vyznate s Permission? Nemohl byste mi poradit nejakej fine tutorial, kde je popsana tvorba vlastni implementace? BtW: Diky - Original Message - From: Lumír Návrat [EMAIL PROTECTED] To: Java konference@java.cz Sent: Wednesday, July 26, 2006 10:16 PM Subject: Re: java.security.Permission No klasicky priklad se uvadi u entitnich objektu, kdy si predstav, ze mas vytisk knihy, ten je identifikovan jednak cislem titulu a dale prirustkovym cislem v ramci daneho titulu. Pokud by jsi pouzil defaultni implementaci, tak by se to porovnavalo pouze na rovnost instanci. To znamena, ze pokud by jsi udelal: Vytisk v1 = new Vytisk(123455,1/2006); Vytisk v2 = new Vytisk(123455,2/2006); v1.equals(v2); // vysledek je false, jelikoz: v1 = this, v2 = object a telo metody equals obsahuje return this == object, coz je porovnavani adres instacni. Proto je nutne provest nasledujici reimplementaci: public boolean equals(Object object) { if (object == null) { return false; } if (object instanceof Vytisk) { Vytisk pomV = (Vytisk)object) return this.id == pomV prirustek.equals(pomV.prirustek); } return false; } Samotna implementace hashcode sice neni zivotne nutna, ale je s ruznych duvodu, ktere si jiz nepamatuji doporucena. Lumi(r) Kamzik-II wrote: No tak to mi potom neni vubec jasne, proc bych to mel reimplementovat - Original Message - From: Lumír Návrat [EMAIL PROTECTED] To: Java konference@java.cz Sent: Wednesday, July 26, 2006 9:14 PM Subject: Re: java.security.Permission Nazdar, strucne co si pamatuji z knizky 57 rad efektivne v JAVe (nebo obdobne) od Blochua, tak to vychazi ze zakladu jedinecnosti objektu a zpusobu jeho porovnavani ve virtualnim stroji. Tyto metody se dedi primo z tridy Object a maji je implementovane vsechny tridy. pravidlo je takove, ze equals zajistuje shodu na urovni aplikace a hashcode na urovni VM = v ruznych instancich VM hashcode myslim muze byt ruzny, zatimco equals je vzdy stejne, ale nejsem si tim ted jisty:( Plati vsak, pokud se reimplementuje equals, tak se musi reimplementovat i hashcode Lumi(r) Kamzik-II wrote: Dobry vecer, prokousavam se bezpecnosti v Jave a narazil jsem na tridu Permission. Rad bych si napsal svou vlastni implementaci, ale trochu me desi nektere metody, oznacene, jako abstraktni, napriklad mi neni jasne, proc by mel Permission objekt povinne reimplementovat metodu hashcode a equals, to equals bych mozna jeste pochopil, ale hashcode mi prijde jako uplna blbost. -- Jiří Mareš (mailto:[EMAIL PROTECTED]) ČSAD SVT Praha, s.r.o. (http://www.svt.cz) Czech Republic
Re: java.security.Permission
Kamzik-II wrote: Ale paklize by tohle vzdy platilo, pak by byla uplna blbost predefinovat metodu equals, protoze by v ni stacilo porovnavat hascode, kdezto v rodicovske implementaci se porovnavaji pouze instance Ta implikace plati pouze jednim smerem! Dva objekty muzou mit stejny hashCode, ale dle metody equals se nerovnaji. Hashcode nemusi byt perfektni ;-)
Re: java.security.Permission
Ja bych doporucoval precist si nejake zaklady programovani, kde se dozvite takovedle zalezitosti a pak hned navazat zakladama programovani v jave :-)) Kamzik-II napsal(a): Ale paklize by tohle vzdy platilo, pak by byla uplna blbost predefinovat metodu equals, protoze by v ni stacilo porovnavat hascode, kdezto v rodicovske implementaci se porovnavaji pouze instance. - Original Message - *From:* Richard Malaschitz mailto:[EMAIL PROTECTED] *To:* Java mailto:konference@java.cz *Sent:* Thursday, July 27, 2006 10:58 AM *Subject:* Re: java.security.Permission A este si treba pozriet Javadoc k samotnemu objektu java.lang.Object. Tam sa pise o metode hashCode(), ze musi byt implementovana tak aby dva objekty, ktore su equals() musia mat rovnaky hshCode(). -- Jiří Mareš (mailto:[EMAIL PROTECTED]) ČSAD SVT Praha, s.r.o. (http://www.svt.cz) Czech Republic
Re: java.security.Permission
Kamzik-II wrote: Ale paklize by tohle vzdy platilo, pak by byla uplna blbost predefinovat metodu equals, protoze by v ni stacilo porovnavat hascode, kdezto v rodicovske implementaci se porovnavaji pouze instance. Mozna byste si o tom mel neco precist, dobry clanek je treba http://www.javaworld.com/javaworld/jw-01-1999/jw-01-object-p2.html hashCode() vraci integer, takze moznych ruznych ( z hlediska equals()) objektu muze byt vice, nez je integer hodnot, napriklad ruznych objektu typu Long. Proto equals() nemuze jenom porovnavat hashCode() hodnoty. Makub -- ~~ Supercomputing Center Brno Martin Kuba Institute of Computer Scienceemail: [EMAIL PROTECTED] Masaryk University http://www.ics.muni.cz/~makub/ Botanicka 68a, 60200 Brno, CZ mobil: +420-603-533775 -- smime.p7s Description: S/MIME Cryptographic Signature
Re: equals a hashCode (WAS: java.security.Permission)
O boze, equals tady nekdo pekne vysvetlil na vytiscich knih, hascode vicemene taky chapu, ale neni mi jasne na co je mi dobrej ;-) - Original Message - From: Vit Novak To: 'Java' Sent: Thursday, July 27, 2006 1:07 PM Subject: equals a hashCode (WAS: java.security.Permission) Zdravim. Doporucuji precist si knizku od pana Blocha (cesky Java efektivne, anglicky Effective Java). Pan Bloch tuto problematiku rozebira pomerne podrobne a myslim, ze tohle patri k zakladnim znalostem, bez kterych dobry Java kod proste psat nebudete. Jedna se totiz o to, ze predefinovani metody equals nebo hashCode vas zavazuje k dodrzeni urcitych pravidel, bez kterych vam treba Collections budou chodit _velmi_ divne nebo vubec. Samozrejme je mozne nadefinovat hashCode a equals implementovat jen jako porovnani hashCode, to ovsem casto neni to, co chcete. Vetsinou jdete obracene nejak si urcite, kdy maji byt dve instance nejake tridy rovne a to naimplementujete. Napriklad budete mozna chtit aby dve ruzne instance tridy mujBigInt, reprezentujici cislo 37, vratily na equals true, ale reprezentace cisla 37 a cisla 56498765654987984632159789 by na equals true vratit nemela. Pak Vas ovsem hashCode zavazuje, aby equals instance vracely stejny hashCode, ale nijak Vas nenuti, aby pro dve instance, ktere equals nejsou byly hashCode ruzne. A zrovna u mujBigIntu hashCode tak, aby pro kazda dve nonequals cisla vratil ruzne hashe, proste nevymyslite. Dalsi vec je, ze kod, kde equals je implementovano jako porovnani hashi, nebude zrovna moc citelny... Toz tak, hodne stesti V. From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Kamzik-IISent: 27. července 2006 12:49To: JavaSubject: Re: java.security.Permission Ale paklize by tohle vzdy platilo, pak by byla uplna blbost predefinovat metodu equals, protoze by v ni stacilo porovnavat hascode, kdezto v rodicovske implementaci se porovnavaji pouze instance. - Original Message - From: Richard Malaschitz To: Java Sent: Thursday, July 27, 2006 10:58 AM Subject: Re: java.security.Permission A este si treba pozriet Javadoc k samotnemu objektu java.lang.Object. Tam sa pise o metode hashCode(), ze musi byt implementovana tak aby dva objekty, ktore su equals() musia mat rovnaky hshCode().
Re: equals a hashCode (WAS: java.security.Permission)
Kamzik-II wrote: O boze, equals tady nekdo pekne vysvetlil na vytiscich knih, hascode vicemene taky chapu, ale neni mi jasne na co je mi dobrej ;-) Hashcode je dobrej v okamziku, kdyz se patricny objekt uklada do hashtabulky ci mnoziny. A to s nejvetsi pravdepodobnosti bude. -- Kamil Podlesak [EMAIL PROTECTED]
Re: equals a hashCode (WAS: java.security.Permission)
Porovnavat objekty podle hashCode je hloupost. HashCode vubec nemusi byt unikatni. Tzn. muzete mit vice ruznych objektu se stejnym hashCodem. Neni zadny problem vracet konstantu jako hashCode, ale je to krajne neefektivni reseni. - Original Message - From: Kamzik-II To: Java Sent: Thursday, July 27, 2006 3:24 PM Subject: Re: equals a hashCode (WAS: java.security.Permission) O boze, equals tady nekdo pekne vysvetlil na vytiscich knih, hascode vicemene taky chapu, ale neni mi jasne na co je mi dobrej ;-) - Original Message - From: Vit Novak To: 'Java' Sent: Thursday, July 27, 2006 1:07 PM Subject: equals a hashCode (WAS: java.security.Permission) Zdravim. Doporucuji precist si knizku od pana Blocha (cesky Java efektivne, anglicky Effective Java). Pan Bloch tuto problematiku rozebira pomerne podrobne a myslim, ze tohle patri k zakladnim znalostem, bez kterych dobry Java kod proste psat nebudete. Jedna se totiz o to, ze predefinovani metody equals nebo hashCode vas zavazuje k dodrzeni urcitych pravidel, bez kterych vam treba Collections budou chodit _velmi_ divne nebo vubec. Samozrejme je mozne nadefinovat hashCode a equals implementovat jen jako porovnani hashCode, to ovsem casto neni to, co chcete. Vetsinou jdete obracene nejak si urcite, kdy maji byt dve instance nejake tridy rovne a to naimplementujete. Napriklad budete mozna chtit aby dve ruzne instance tridy mujBigInt, reprezentujici cislo 37, vratily na equals true, ale reprezentace cisla 37 a cisla 56498765654987984632159789 by na equals true vratit nemela. Pak Vas ovsem hashCode zavazuje, aby equals instance vracely stejny hashCode, ale nijak Vas nenuti, aby pro dve instance, ktere equals nejsou byly hashCode ruzne. A zrovna u mujBigIntu hashCode tak, aby pro kazda dve nonequals cisla vratil ruzne hashe, proste nevymyslite. Dalsi vec je, ze kod, kde equals je implementovano jako porovnani hashi, nebude zrovna moc citelny... Toz tak, hodne stesti V. From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Kamzik-IISent: 27. července 2006 12:49To: JavaSubject: Re: java.security.Permission Ale paklize by tohle vzdy platilo, pak by byla uplna blbost predefinovat metodu equals, protoze by v ni stacilo porovnavat hascode, kdezto v rodicovske implementaci se porovnavaji pouze instance. - Original Message - From: Richard Malaschitz To: Java Sent: Thursday, July 27, 2006 10:58 AM Subject: Re: java.security.Permission A este si treba pozriet Javadoc k samotnemu objektu java.lang.Object. Tam sa pise o metode hashCode(), ze musi byt implementovana tak aby dva objekty, ktore su equals() musia mat rovnaky hshCode(). !DSPAM:44c8be3a124801581612101!
Re: equals a hashCode (WAS: java.security.Permission)
Jo jo jasne, ale me spis zajima, proc je v ramci vm a ne v ramci aplikace, btw: neni to nahodou to same? - Original Message - From: Kamil Podlesak [EMAIL PROTECTED] To: Java konference@java.cz Sent: Thursday, July 27, 2006 3:25 PM Subject: Re: equals a hashCode (WAS: java.security.Permission) Kamzik-II wrote: O boze, equals tady nekdo pekne vysvetlil na vytiscich knih, hascode vicemene taky chapu, ale neni mi jasne na co je mi dobrej ;-) Hashcode je dobrej v okamziku, kdyz se patricny objekt uklada do hashtabulky ci mnoziny. A to s nejvetsi pravdepodobnosti bude. -- Kamil Podlesak [EMAIL PROTECTED]
RE: equals a hashCode (WAS: java.security.Permission)
V HashMap,Hashtable apod. V nich jsou prvky organizovany dle jejich hashcodu (rychlejsi vyhodnoceni (ne)shody pri hledani) a teprve v zaverecne fazy se pouzijeequals. V hash tabulkach jsou totiz prvky organizovany dle jejich hashcode (kolize se resi prostym retezenim za sebou, nebo do spojoveho seznamu). Tudiz pri dotazech typu containsKey, get apod senejprve hleda dle hashcode a nasledne se provadi porovnani pres equals. Honza -Original Message-From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]On Behalf Of Kamzik-IISent: Thursday, July 27, 2006 3:25 PMTo: JavaSubject: Re: equals a hashCode (WAS: java.security.Permission) O boze, equals tady nekdo pekne vysvetlil na vytiscich knih, hascode vicemene taky chapu, ale neni mi jasne na co je mi dobrej ;-) - Original Message - From: Vit Novak To: 'Java' Sent: Thursday, July 27, 2006 1:07 PM Subject: equals a hashCode (WAS: java.security.Permission) Zdravim. Doporucuji precist si knizku od pana Blocha (cesky Java efektivne, anglicky Effective Java). Pan Bloch tuto problematiku rozebira pomerne podrobne a myslim, ze tohle patri k zakladnim znalostem, bez kterych dobry Java kod proste psat nebudete. Jedna se totiz o to, ze predefinovani metody equals nebo hashCode vas zavazuje k dodrzeni urcitych pravidel, bez kterych vam treba Collections budou chodit _velmi_ divne nebo vubec. Samozrejme je mozne nadefinovat hashCode a equals implementovat jen jako porovnani hashCode, to ovsem casto neni to, co chcete. Vetsinou jdete obracene nejak si urcite, kdy maji byt dve instance nejake tridy rovne a to naimplementujete. Napriklad budete mozna chtit aby dve ruzne instance tridy mujBigInt, reprezentujici cislo 37, vratily na equals true, ale reprezentace cisla 37 a cisla 56498765654987984632159789 by na equals true vratit nemela. Pak Vas ovsem hashCode zavazuje, aby equals instance vracely stejny hashCode, ale nijak Vas nenuti, aby pro dve instance, ktere equals nejsou byly hashCode ruzne. A zrovna u mujBigIntu hashCode tak, aby pro kazda dve nonequals cisla vratil ruzne hashe, proste nevymyslite. Dalsi vec je, ze kod, kde equals je implementovano jako porovnani hashi, nebude zrovna moc citelny... Toz tak, hodne stesti V. From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Kamzik-IISent: 27. července 2006 12:49To: JavaSubject: Re: java.security.Permission Ale paklize by tohle vzdy platilo, pak by byla uplna blbost predefinovat metodu equals, protoze by v ni stacilo porovnavat hascode, kdezto v rodicovske implementaci se porovnavaji pouze instance. - Original Message - From: Richard Malaschitz To: Java Sent: Thursday, July 27, 2006 10:58 AM Subject: Re: java.security.Permission A este si treba pozriet Javadoc k samotnemu objektu java.lang.Object. Tam sa pise o metode hashCode(), ze musi byt implementovana tak aby dva objekty, ktore su equals() musia mat rovnaky hshCode().
Re: equals a hashCode (WAS: java.security.Permission)
Koukal sem do toho JavaDocu a neni mi teda jasne, k cemu by se to dalo vyuzit... Je tam psano o hashtables, ktere jsem asi taky nepochopil, nebo nwim, asi jsem uplne mimo, myslel jsem, ze je to nejake id objektu, ale pokud stejne cislo muze vracet vic objektu, tak se to neda pouzit ani na to... - Original Message - From: Kamzik-II [EMAIL PROTECTED] To: Java konference@java.cz Sent: Thursday, July 27, 2006 3:30 PM Subject: Re: equals a hashCode (WAS: java.security.Permission) Jo jo jasne, ale me spis zajima, proc je v ramci vm a ne v ramci aplikace, btw: neni to nahodou to same? - Original Message - From: Kamil Podlesak [EMAIL PROTECTED] To: Java konference@java.cz Sent: Thursday, July 27, 2006 3:25 PM Subject: Re: equals a hashCode (WAS: java.security.Permission) Kamzik-II wrote: O boze, equals tady nekdo pekne vysvetlil na vytiscich knih, hascode vicemene taky chapu, ale neni mi jasne na co je mi dobrej ;-) Hashcode je dobrej v okamziku, kdyz se patricny objekt uklada do hashtabulky ci mnoziny. A to s nejvetsi pravdepodobnosti bude. -- Kamil Podlesak [EMAIL PROTECTED]
Re: equals a hashCode (WAS: java.security.Permission)
Aha takze ciste jenom kvuli rychlosti? - Original Message - From: Moravec Jan To: Java Sent: Thursday, July 27, 2006 3:32 PM Subject: RE: equals a hashCode (WAS: java.security.Permission) V HashMap,Hashtable apod. V nich jsou prvky organizovany dle jejich hashcodu (rychlejsi vyhodnoceni (ne)shody pri hledani) a teprve v zaverecne fazy se pouzijeequals. V hash tabulkach jsou totiz prvky organizovany dle jejich hashcode (kolize se resi prostym retezenim za sebou, nebo do spojoveho seznamu). Tudiz pri dotazech typu containsKey, get apod senejprve hleda dle hashcode a nasledne se provadi porovnani pres equals. Honza -Original Message-From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]On Behalf Of Kamzik-IISent: Thursday, July 27, 2006 3:25 PMTo: JavaSubject: Re: equals a hashCode (WAS: java.security.Permission) O boze, equals tady nekdo pekne vysvetlil na vytiscich knih, hascode vicemene taky chapu, ale neni mi jasne na co je mi dobrej ;-) - Original Message - From: Vit Novak To: 'Java' Sent: Thursday, July 27, 2006 1:07 PM Subject: equals a hashCode (WAS: java.security.Permission) Zdravim. Doporucuji precist si knizku od pana Blocha (cesky Java efektivne, anglicky Effective Java). Pan Bloch tuto problematiku rozebira pomerne podrobne a myslim, ze tohle patri k zakladnim znalostem, bez kterych dobry Java kod proste psat nebudete. Jedna se totiz o to, ze predefinovani metody equals nebo hashCode vas zavazuje k dodrzeni urcitych pravidel, bez kterych vam treba Collections budou chodit _velmi_ divne nebo vubec. Samozrejme je mozne nadefinovat hashCode a equals implementovat jen jako porovnani hashCode, to ovsem casto neni to, co chcete. Vetsinou jdete obracene nejak si urcite, kdy maji byt dve instance nejake tridy rovne a to naimplementujete. Napriklad budete mozna chtit aby dve ruzne instance tridy mujBigInt, reprezentujici cislo 37, vratily na equals true, ale reprezentace cisla 37 a cisla 56498765654987984632159789 by na equals true vratit nemela. Pak Vas ovsem hashCode zavazuje, aby equals instance vracely stejny hashCode, ale nijak Vas nenuti, aby pro dve instance, ktere equals nejsou byly hashCode ruzne. A zrovna u mujBigIntu hashCode tak, aby pro kazda dve nonequals cisla vratil ruzne hashe, proste nevymyslite. Dalsi vec je, ze kod, kde equals je implementovano jako porovnani hashi, nebude zrovna moc citelny... Toz tak, hodne stesti V. From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Kamzik-IISent: 27. července 2006 12:49To: JavaSubject: Re: java.security.Permission Ale paklize by tohle vzdy platilo, pak by byla uplna blbost predefinovat metodu equals, protoze by v ni stacilo porovnavat hascode, kdezto v rodicovske implementaci se porovnavaji pouze instance. - Original Message - From: Richard Malaschitz To: Java Sent: Thursday, July 27, 2006 10:58 AM Subject: Re: java.security.Permission A este si treba pozriet Javadoc k samotnemu objektu java.lang.Object. Tam sa pise o metode hashCode(), ze musi byt implementovana tak aby dva objekty, ktore su equals() musia mat rovnaky hshCode().
RE: equals a hashCode (WAS: java.security.Permission)
To je daleko starsi koncept. Pamatuji se, ze ve skole jsme se o tom ucili v zakladech programovani a to bylo min 2 roky pred Javou (uz jsemkmet ;) H. -Original Message-From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]On Behalf Of Kamzik-IISent: Thursday, July 27, 2006 3:41 PMTo: JavaSubject: Re: equals a hashCode (WAS: java.security.Permission) Hm dumyslne ;-) Ti navrhari javy nebyli uplne "blbi" :) - Original Message - From: Moravec Jan To: Java Sent: Thursday, July 27, 2006 3:38 PM Subject: RE: equals a hashCode (WAS: java.security.Permission) Trefa do cernyho ;) Pres hashcode se "nablizite", pres equals dohledate. Princip je ten, ze nedelate equals pres vsechno (u slozitejsich objektu muze byt pomale,treba i u Stringu by ten equals nemusel byt uplne idealni). H. -Original Message-From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]On Behalf Of Kamzik-IISent: Thursday, July 27, 2006 3:37 PMTo: JavaSubject: Re: equals a hashCode (WAS: java.security.Permission) Aha takze ciste jenom kvuli rychlosti? - Original Message - From: Moravec Jan To: Java Sent: Thursday, July 27, 2006 3:32 PM Subject: RE: equals a hashCode (WAS: java.security.Permission) V HashMap,Hashtable apod. V nich jsou prvky organizovany dle jejich hashcodu (rychlejsi vyhodnoceni (ne)shody pri hledani) a teprve v zaverecne fazy se pouzijeequals. V hash tabulkach jsou totiz prvky organizovany dle jejich hashcode (kolize se resi prostym retezenim za sebou, nebo do spojoveho seznamu). Tudiz pri dotazech typu containsKey, get apod senejprve hleda dle hashcode a nasledne se provadi porovnani pres equals. Honza -Original Message-From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]On Behalf Of Kamzik-IISent: Thursday, July 27, 2006 3:25 PMTo: JavaSubject: Re: equals a hashCode (WAS: java.security.Permission) O boze, equals tady nekdo pekne vysvetlil na vytiscich knih, hascode vicemene taky chapu, ale neni mi jasne na co je mi dobrej ;-) - Original Message - From: Vit Novak To: 'Java' Sent: Thursday, July 27, 2006 1:07 PM Subject: equals a hashCode (WAS: java.security.Permission) Zdravim. Doporucuji precist si knizku od pana Blocha (cesky Java efektivne, anglicky Effective Java). Pan Bloch tuto problematiku rozebira pomerne podrobne a myslim, ze tohle patri k zakladnim znalostem, bez kterych dobry Java kod proste psat nebudete. Jedna se totiz o to, ze predefinovani metody equals nebo hashCode vas zavazuje k dodrzeni urcitych pravidel, bez kterych vam treba Collections budou chodit _velmi_ divne nebo vubec. Samozrejme je mozne nadefinovat hashCode a equals implementovat jen jako porovnani hashCode, to ovsem casto neni to, co chcete. Vetsinou jdete obracene nejak si urcite, kdy maji byt dve instance nejake tridy rovne a to naimplementujete. Napriklad budete mozna chtit aby dve ruzne instance tridy mujBigInt, reprezentujici cislo 37, vratily na equals true, ale reprezentace cisla 37 a cisla 56498765654987984632159789 by na equals true vratit nemela. Pak Vas ovsem hashCode zavazuje, aby equals instance vracely stejny hashCode, ale nijak Vas nenuti, aby pro dve instance, ktere equals nejsou byly hashCode ruzne. A zrovna u mujBigIntu hashCode tak, aby pro kazda dve nonequals cisla vratil ruzne hashe, proste nevymyslite. Dalsi vec je, ze kod, kde equals je implementovano jako porovnani hashi, nebude zrovna moc citelny... Toz tak, hodne stesti V. From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Kamzik-IISent: 27. července 2006 12:49To: JavaSubject: Re: java.security.Permission Ale paklize by tohle vzdy platilo, pak by byla uplna blbost predefinovat metodu equals, protoze by v ni stacilo porovnav
Re: equals a hashCode (WAS: java.security.Permission)
Predstavte si kolekci jako soubor plechovek. Kazda plechovka ma cislo podle hashCode a obsahuje urcity pocet prvku. Dejme tomu, ze se hashCode pro kazdy klic v HashMap pocita tak, ze u kazdeho pismena se zjisti poradi v abecede a pricte se k vyslednemu hashCode. mame klice : Mary(20), Amy(15), May(15), Dirk(34) - hodnoty nemusite prepocitavat...nejsou presne, ale pro ilustraci to staci takze plechovka s cislem 20 bude obsahovat klic Mary, plechovka s cislem 15 klice Amy a May atd. Vyhledavani v kolekcich funguje tak, ze se pomoci hashCode najde spravna plechovka a ta se projde pomoci metody equals! Muzete vracet konstantu jako hashCode, ale to by bylo neefektivni - jedna plechovka a prilis mnoho volani equals. Takze je vyhodne vracet hodnotu vypocitanou z atributu klice. Je dulezite si uvedomit, ze hashCode se musi pocitat tak, aby bylo KONZISTENTNI. Tzn. nemuzeme ho pocitat pomoci transientnich atributu. Mohl byste ulozit jiny hashCode, nez pomoci ktereho budete hledat. Tzn. objekt byste podle daneho hashCode nemohl vubec dohledat. Stejne tak by mohl fungovat nahodne generovany hashCode. Takze hashCode neni jen o rychlosti, ale take o fungovani v kolekcich! Doufam, ze to trochu pomohlo. - Original Message - From: Kamzik-II [EMAIL PROTECTED] To: Java konference@java.cz Sent: Thursday, July 27, 2006 3:36 PM Subject: Re: equals a hashCode (WAS: java.security.Permission) Koukal sem do toho JavaDocu a neni mi teda jasne, k cemu by se to dalo vyuzit... Je tam psano o hashtables, ktere jsem asi taky nepochopil, nebo nwim, asi jsem uplne mimo, myslel jsem, ze je to nejake id objektu, ale pokud stejne cislo muze vracet vic objektu, tak se to neda pouzit ani na to... - Original Message - From: Kamzik-II [EMAIL PROTECTED] To: Java konference@java.cz Sent: Thursday, July 27, 2006 3:30 PM Subject: Re: equals a hashCode (WAS: java.security.Permission) Jo jo jasne, ale me spis zajima, proc je v ramci vm a ne v ramci aplikace, btw: neni to nahodou to same? - Original Message - From: Kamil Podlesak [EMAIL PROTECTED] To: Java konference@java.cz Sent: Thursday, July 27, 2006 3:25 PM Subject: Re: equals a hashCode (WAS: java.security.Permission) Kamzik-II wrote: O boze, equals tady nekdo pekne vysvetlil na vytiscich knih, hascode vicemene taky chapu, ale neni mi jasne na co je mi dobrej ;-) Hashcode je dobrej v okamziku, kdyz se patricny objekt uklada do hashtabulky ci mnoziny. A to s nejvetsi pravdepodobnosti bude. -- Kamil Podlesak [EMAIL PROTECTED] !DSPAM:44c8c0dd124801367610778!
Re: equals a hashCode (WAS: java.security.Permission)
Kamzik-II wrote: Koukal sem do toho JavaDocu a neni mi teda jasne, k cemu by se to dalo vyuzit... Je tam psano o hashtables, ktere jsem asi taky nepochopil, nebo nwim, asi jsem uplne mimo, myslel jsem, ze je to nejake id objektu, ale pokud stejne cislo muze vracet vic objektu, tak se to neda pouzit ani na to... Prosim, prosim, na webu jsou tisice a tisice ruznych popisu hashtabulek a na jakem principu funguji. Popis teto datove struktury sem nepatri, navic KAZDY programator ji musi znat, protoze se jedna o jednu z nejpouzivanejsich datovych struktur (obzvlaste v Jave). -- Kamil Podlesak [EMAIL PROTECTED]
Re: equals a hashCode (WAS: java.security.Permission)
Moravec Jan wrote: To je daleko starsi koncept. Pamatuji se, ze ve skole jsme se o tom ucili v zakladech programovani a to bylo min 2 roky pred Javou (uz jsem kmet ;) H. Myslim, ze hashovani vymysleli 50 letech v IBM :-)
Re: equals a hashCode (WAS: java.security.Permission)
To nic nemeni na tom, ze je to genialni a pritom tak jednoduche;-) - Original Message - From: Moravec Jan To: Java Sent: Thursday, July 27, 2006 3:43 PM Subject: RE: equals a hashCode (WAS: java.security.Permission) To je daleko starsi koncept. Pamatuji se, ze ve skole jsme se o tom ucili v zakladech programovani a to bylo min 2 roky pred Javou (uz jsemkmet ;) H. -Original Message-From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]On Behalf Of Kamzik-IISent: Thursday, July 27, 2006 3:41 PMTo: JavaSubject: Re: equals a hashCode (WAS: java.security.Permission) Hm dumyslne ;-) Ti navrhari javy nebyli uplne "blbi" :) - Original Message - From: Moravec Jan To: Java Sent: Thursday, July 27, 2006 3:38 PM Subject: RE: equals a hashCode (WAS: java.security.Permission) Trefa do cernyho ;) Pres hashcode se "nablizite", pres equals dohledate. Princip je ten, ze nedelate equals pres vsechno (u slozitejsich objektu muze byt pomale,treba i u Stringu by ten equals nemusel byt uplne idealni). H. -Original Message-From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]On Behalf Of Kamzik-IISent: Thursday, July 27, 2006 3:37 PMTo: JavaSubject: Re: equals a hashCode (WAS: java.security.Permission) Aha takze ciste jenom kvuli rychlosti? - Original Message - From: Moravec Jan To: Java Sent: Thursday, July 27, 2006 3:32 PM Subject: RE: equals a hashCode (WAS: java.security.Permission) V HashMap,Hashtable apod. V nich jsou prvky organizovany dle jejich hashcodu (rychlejsi vyhodnoceni (ne)shody pri hledani) a teprve v zaverecne fazy se pouzijeequals. V hash tabulkach jsou totiz prvky organizovany dle jejich hashcode (kolize se resi prostym retezenim za sebou, nebo do spojoveho seznamu). Tudiz pri dotazech typu containsKey, get apod senejprve hleda dle hashcode a nasledne se provadi porovnani pres equals. Honza -Original Message-From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]On Behalf Of Kamzik-IISent: Thursday, July 27, 2006 3:25 PMTo: JavaSubject: Re: equals a hashCode (WAS: java.security.Permission) O boze, equals tady nekdo pekne vysvetlil na vytiscich knih, hascode vicemene taky chapu, ale neni mi jasne na co je mi dobrej ;-) - Original Message - From: Vit Novak To: 'Java' Sent: Thursday, July 27, 2006 1:07 PM Subject: equals a hashCode (WAS: java.security.Permission) Zdravim. Doporucuji precist si knizku od pana Blocha (cesky Java efektivne, anglicky Effective Java). Pan Bloch tuto problematiku rozebira pomerne podrobne a myslim, ze tohle patri k zakladnim znalostem, bez kterych dobry Java kod proste psat nebudete. Jedna se totiz o to, ze predefinovani metody equals nebo hashCode vas zavazuje k dodrzeni urcitych pravidel, bez kterych vam treba Collections budou chodit _velmi_ divne nebo vubec. Samozrejme je mozne nadefinovat hashCode a equals implementovat jen jako porovnani hashCode, to ovsem casto neni to, co chcete. Vetsinou jdete obracene nejak si urcite, kdy maji byt dve instance nejake tridy rovne a to naimplementujete. Napriklad budete mozna chtit aby dve ruzne instance tridy mujBigInt, reprezentujici cislo 37, vratily na equals true, ale reprezentace cisla 37 a cisla 56498765654987984632159789 by na equals true vratit nemela. Pak Vas ovsem hashCode zavazuje, aby equals instance vracely stejny hashCode, ale nijak Vas nenuti, aby pro dve instance, ktere equals nejsou byly hashCode ruzne. A zrovna u mujBigIntu hashCode tak, aby pro kazda dve nonequals cisla vratil ruzne hashe, proste nevymyslite. Dalsi vec je, ze kod, kde equals je implementovano jako porovnani hashi, nebude zrovna moc citelny... Toz tak, hodne stesti
Re: equals a hashCode (WAS: java.security.Permission)
Kamil Podlesak wrote: Kamzik-II wrote: Koukal sem do toho JavaDocu a neni mi teda jasne, k cemu by se to dalo vyuzit... Je tam psano o hashtables, ktere jsem asi taky nepochopil, nebo nwim, asi jsem uplne mimo, myslel jsem, ze je to nejake id objektu, ale pokud stejne cislo muze vracet vic objektu, tak se to neda pouzit ani na to... Prosim, prosim, na webu jsou tisice a tisice ruznych popisu hashtabulek a na jakem principu funguji. Popis teto datove struktury sem nepatri, navic KAZDY programator ji musi znat, protoze se jedna o jednu z nejpouzivanejsich datovych struktur (obzvlaste v Jave). Jo, kazdy spravny programator by mel mit doma v knihovnicce neco jako http://www.mpi-sb.mpg.de/~mehlhorn/DatAlgbooks.html Stejne tak by mel kazdy programator svuj program dokazat, jak si to predstavoval pan Dijkstra ;-)
Re: equals a hashCode (WAS: java.security.Permission)
Tady je opet potreba se na to podivat skrz teorii algoritmu. Ale jinak jak pisou ostatni na webu je spousta popisu ktere to vysvetli podrobneji a lepe. Hastable, jsou tabulky zalozene na slovniku. tj, na dvojicich (klic, jeho vyznam). Pricemz zakladni vyznam, je v rychlejsim nalezeni hodnoty k danemu klici. Kdyz si tedy predstavite nejaky slovnik, treba AN-CZ, v nem mate nejaky klic, ten klic muze mit v cestine vice vyznamu. Zde pak zalezi na konkretni implementaci hashovaci tabulky. Jedna z implementaci napriklad funguje tak, ze spocita hashcode klice a bude to jeho umisteni v tabulce, pokud ale nastane pripad, ze nejaky objekt ma stejny hashcode, a jeho pozice je jiz obsazena, tak nalezne prvni volne misto v tabulce za timto objektem a tam jej ulozi. Samozrejme, jen tehdy,pokud to tabulka dovoli (muze prohlasit, s hashcodem tam muze byt jen jeden stejny objekt a pak ho prepise). Dalsi implementace je takova, ze na pozici s danou hodnotou hashcode ma ulozeny nejakou jinou strukturu (pole, kolekci apod).a ta obsahuje vsechny objekty se stejnym hashcode. Pokud potom vyzaduje aplikace nalezt konkretni objekt, tak pak zalezi zda vrati na zaklade hashcode vsechny, nebo pak prochazi jinym zpusobem tu strukturu obsahujici dane objekty (napr. pomoci metody equals). Lumi(r) Kamzik-II wrote: Koukal sem do toho JavaDocu a neni mi teda jasne, k cemu by se to dalo vyuzit... Je tam psano o hashtables, ktere jsem asi taky nepochopil, nebo nwim, asi jsem uplne mimo, myslel jsem, ze je to nejake id objektu, ale pokud stejne cislo muze vracet vic objektu, tak se to neda pouzit ani na to... - Original Message - From: Kamzik-II [EMAIL PROTECTED] To: Java konference@java.cz Sent: Thursday, July 27, 2006 3:30 PM Subject: Re: equals a hashCode (WAS: java.security.Permission) Jo jo jasne, ale me spis zajima, proc je v ramci vm a ne v ramci aplikace, btw: neni to nahodou to same? - Original Message - From: Kamil Podlesak [EMAIL PROTECTED] To: Java konference@java.cz Sent: Thursday, July 27, 2006 3:25 PM Subject: Re: equals a hashCode (WAS: java.security.Permission) Kamzik-II wrote: O boze, equals tady nekdo pekne vysvetlil na vytiscich knih, hascode vicemene taky chapu, ale neni mi jasne na co je mi dobrej ;-) Hashcode je dobrej v okamziku, kdyz se patricny objekt uklada do hashtabulky ci mnoziny. A to s nejvetsi pravdepodobnosti bude. -- Kamil Podlesak [EMAIL PROTECTED]
Re: equals a hashCode (WAS: java.security.Permission)
Ne;-) - Original Message - From: Kamzik-II [EMAIL PROTECTED] To: Java konference@java.cz Sent: Thursday, July 27, 2006 4:11 PM Subject: Re: equals a hashCode (WAS: java.security.Permission) no equals a hashcode uz chapu ;-) jeste jedna otazka ohledne kolekci, muze kolekce Map mit pro jeden klic vice objektu? - Original Message - From: Stanislav Ošmera [EMAIL PROTECTED] To: Java konference@java.cz Sent: Thursday, July 27, 2006 4:04 PM Subject: Re: equals a hashCode (WAS: java.security.Permission) Mimo jine se doporucuje aby funkce ktera vraci hashcode byla velmi jednoducha a rychla protoze se pouzije jako prvni a nejcasteji (kdyz je ruzny hashcode tak se jiz dale nic nezjistuje) A az pak funkce equals muze byt velmi slozita na vyhodnoceni. Napriklad mam slozity objekt ktery ma spoustu atributu. Hashcode vytvorim jen treba pouzitim 3 z nich ktery jsou primitivni typy, kdezto pri equals porovnavam vsechny atributy a to u nekterych muze znamenat porovnavani jinych objektu s podobnou slozitosti. Ale opravdu bude lepe si precist nejakou knizku o tehlech hlavnich algoritmickych myslenkach ktere jsou v Jave, ten zminovany Bloch je treba zrovna na tohle vyborny. P.S. jinak tomu spojeni equal a hashCode se rika equals contract -- Stanislav Ošmera Work: +44 (0)2075 980 348 Cell: +44 (0)7914 635 412 !DSPAM:44c8c935124803984916995!
Re: equals a hashCode (WAS: java.security.Permission)
V tom pripade teda nechapu, jak muze hashtable mit vic objektu pro jeden klic, kdyz je to vlastne implementace hashmapy, ktera je odvozena od map? - Original Message - From: Pavel Kubal [EMAIL PROTECTED] To: Java konference@java.cz Sent: Thursday, July 27, 2006 4:09 PM Subject: Re: equals a hashCode (WAS: java.security.Permission) Ne;-) - Original Message - From: Kamzik-II [EMAIL PROTECTED] To: Java konference@java.cz Sent: Thursday, July 27, 2006 4:11 PM Subject: Re: equals a hashCode (WAS: java.security.Permission) no equals a hashcode uz chapu ;-) jeste jedna otazka ohledne kolekci, muze kolekce Map mit pro jeden klic vice objektu? - Original Message - From: Stanislav Ošmera [EMAIL PROTECTED] To: Java konference@java.cz Sent: Thursday, July 27, 2006 4:04 PM Subject: Re: equals a hashCode (WAS: java.security.Permission) Mimo jine se doporucuje aby funkce ktera vraci hashcode byla velmi jednoducha a rychla protoze se pouzije jako prvni a nejcasteji (kdyz je ruzny hashcode tak se jiz dale nic nezjistuje) A az pak funkce equals muze byt velmi slozita na vyhodnoceni. Napriklad mam slozity objekt ktery ma spoustu atributu. Hashcode vytvorim jen treba pouzitim 3 z nich ktery jsou primitivni typy, kdezto pri equals porovnavam vsechny atributy a to u nekterych muze znamenat porovnavani jinych objektu s podobnou slozitosti. Ale opravdu bude lepe si precist nejakou knizku o tehlech hlavnich algoritmickych myslenkach ktere jsou v Jave, ten zminovany Bloch je treba zrovna na tohle vyborny. P.S. jinak tomu spojeni equal a hashCode se rika equals contract -- Stanislav Ošmera Work: +44 (0)2075 980 348 Cell: +44 (0)7914 635 412 !DSPAM:44c8c935124803984916995!
Re: equals a hashCode (WAS: java.security.Permission)
API dokumentace pravi : metoda put() : Associates the specified value with the specified key in this map (optional operation). If the map previously contained a mapping for this key, the old value is replaced by the specified value. (A map m is said to contain a mapping for a key k if and only if m.containsKey(k) would return true.)) Jak by mohla mit mapa vic objektu pro jeden klic? Pavel Kubal - Original Message - From: Kamzik-II [EMAIL PROTECTED] To: Java konference@java.cz Sent: Thursday, July 27, 2006 4:15 PM Subject: Re: equals a hashCode (WAS: java.security.Permission) V tom pripade teda nechapu, jak muze hashtable mit vic objektu pro jeden klic, kdyz je to vlastne implementace hashmapy, ktera je odvozena od map? - Original Message - From: Pavel Kubal [EMAIL PROTECTED] To: Java konference@java.cz Sent: Thursday, July 27, 2006 4:09 PM Subject: Re: equals a hashCode (WAS: java.security.Permission) Ne;-) - Original Message - From: Kamzik-II [EMAIL PROTECTED] To: Java konference@java.cz Sent: Thursday, July 27, 2006 4:11 PM Subject: Re: equals a hashCode (WAS: java.security.Permission) no equals a hashcode uz chapu ;-) jeste jedna otazka ohledne kolekci, muze kolekce Map mit pro jeden klic vice objektu? - Original Message - From: Stanislav Ošmera [EMAIL PROTECTED] To: Java konference@java.cz Sent: Thursday, July 27, 2006 4:04 PM Subject: Re: equals a hashCode (WAS: java.security.Permission) Mimo jine se doporucuje aby funkce ktera vraci hashcode byla velmi jednoducha a rychla protoze se pouzije jako prvni a nejcasteji (kdyz je ruzny hashcode tak se jiz dale nic nezjistuje) A az pak funkce equals muze byt velmi slozita na vyhodnoceni. Napriklad mam slozity objekt ktery ma spoustu atributu. Hashcode vytvorim jen treba pouzitim 3 z nich ktery jsou primitivni typy, kdezto pri equals porovnavam vsechny atributy a to u nekterych muze znamenat porovnavani jinych objektu s podobnou slozitosti. Ale opravdu bude lepe si precist nejakou knizku o tehlech hlavnich algoritmickych myslenkach ktere jsou v Jave, ten zminovany Bloch je treba zrovna na tohle vyborny. P.S. jinak tomu spojeni equal a hashCode se rika equals contract -- Stanislav Ošmera Work: +44 (0)2075 980 348 Cell: +44 (0)7914 635 412 !DSPAM:44c8ca12124801431714180!
Re: equals a hashCode (WAS: java.security.Permission)
Uz ctu... a stydim se ;-) - Original Message - From: Jiri Fabian [EMAIL PROTECTED] To: 'Java' konference@java.cz Sent: Thursday, July 27, 2006 4:30 PM Subject: RE: equals a hashCode (WAS: java.security.Permission) To je diskuze o @. Jeden o voze, druhej o koze. Slovnik je pred tebou skrytej, takze ten zahashovanej vlacek k jednomu policku nevidis, nestaras o nej - musis jen mit hashcode() i equals(). Kamziku, nespamuj a mazej si cist. Pripominas mi malyho fakana, co taha tatu za kosili a furt se ho dokolecka pta k cemu je volant. fil -Original Message- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Lumír Návrat Sent: Thursday, July 27, 2006 4:20 PM To: Java Subject: Re: equals a hashCode (WAS: java.security.Permission) Protoze, nejcastejsi reseni je, ze si to managujete sam. Zde je totiz rozdil, mezi teorii a JAVou, Java totiz nepovoluje mit vice objektu k jednomu klici, takze se to obchazi tak, ze si k danemu klici vlozite jako hodnotu nejakou kolekci a v ni si udrzujete objekty patrici danemu klici. Zda ta dalsi kolekce je hashmap, ci nejaky list, set apod. je jiz na Vas a na potrebach projektu Lumi(r) Kamzik-II wrote: V tom pripade teda nechapu, jak muze hashtable mit vic objektu pro jeden klic, kdyz je to vlastne implementace hashmapy, ktera je odvozena od map? - Original Message - From: Pavel Kubal [EMAIL PROTECTED] To: Java konference@java.cz Sent: Thursday, July 27, 2006 4:09 PM Subject: Re: equals a hashCode (WAS: java.security.Permission) Ne;-) - Original Message - From: Kamzik-II [EMAIL PROTECTED] To: Java konference@java.cz Sent: Thursday, July 27, 2006 4:11 PM Subject: Re: equals a hashCode (WAS: java.security.Permission) no equals a hashcode uz chapu ;-) jeste jedna otazka ohledne kolekci, muze kolekce Map mit pro jeden klic vice objektu? - Original Message - From: Stanislav Ošmera [EMAIL PROTECTED] To: Java konference@java.cz Sent: Thursday, July 27, 2006 4:04 PM Subject: Re: equals a hashCode (WAS: java.security.Permission) Mimo jine se doporucuje aby funkce ktera vraci hashcode byla velmi jednoducha a rychla protoze se pouzije jako prvni a nejcasteji (kdyz je ruzny hashcode tak se jiz dale nic nezjistuje) A az pak funkce equals muze byt velmi slozita na vyhodnoceni. Napriklad mam slozity objekt ktery ma spoustu atributu. Hashcode vytvorim jen treba pouzitim 3 z nich ktery jsou primitivni typy, kdezto pri equals porovnavam vsechny atributy a to u nekterych muze znamenat porovnavani jinych objektu s podobnou slozitosti. Ale opravdu bude lepe si precist nejakou knizku o tehlech hlavnich algoritmickych myslenkach ktere jsou v Jave, ten zminovany Bloch je treba zrovna na tohle vyborny. P.S. jinak tomu spojeni equal a hashCode se rika equals contract -- Stanislav Ošmera Work: +44 (0)2075 980 348 Cell: +44 (0)7914 635 412 !DSPAM:44c8c935124803984916995!
Re: equals a hashCode (WAS: java.security.Permission)
Kdyz se podivate do API, tak zjistite, ze Dictionary je obsolete a ma se pouzit Map, jenze zaroven to je stale abstraktni trida, ktera Vam implementuje to spolecne pro vsechny (key, value) colekce. Jednim ze zasadnich zvratu ve vyvoji Javy, byl prepracovani Collections API mezi verzemi JAVy 1.1.x a 1.2.x a vyssi. S ohledem na implementaci HashMap, HashTable v JAVe je ten muj priklad, se slovnikem opravdu mirne zavadejici, ale podle obecne teorie v tom problem neni. Samozjreme si muzete napsat vlastni implementaci HashMapy, ktera Vam mnou popsane reseni vice objektu pro klic bude resit sama. Mozna jej dokonce jiz naleznete implementovane v baliku Apache Collections. (Vim, ze zde minimalne existuje podpora pro hastamap s klicem, skladajicim, se ze dvou objektu. Lumi(r) Kamzik-II wrote: a proc se to obchazi a nepouzije se rozhranni Dictionary? - Original Message - From: Lumír Návrat [EMAIL PROTECTED] To: Java konference@java.cz Sent: Thursday, July 27, 2006 4:19 PM Subject: Re: equals a hashCode (WAS: java.security.Permission) Protoze, nejcastejsi reseni je, ze si to managujete sam. Zde je totiz rozdil, mezi teorii a JAVou, Java totiz nepovoluje mit vice objektu k jednomu klici, takze se to obchazi tak, ze si k danemu klici vlozite jako hodnotu nejakou kolekci a v ni si udrzujete objekty patrici danemu klici. Zda ta dalsi kolekce je hashmap, ci nejaky list, set apod. je jiz na Vas a na potrebach projektu Lumi(r) Kamzik-II wrote: V tom pripade teda nechapu, jak muze hashtable mit vic objektu pro jeden klic, kdyz je to vlastne implementace hashmapy, ktera je odvozena od map? - Original Message - From: Pavel Kubal [EMAIL PROTECTED] To: Java konference@java.cz Sent: Thursday, July 27, 2006 4:09 PM Subject: Re: equals a hashCode (WAS: java.security.Permission) Ne;-) - Original Message - From: Kamzik-II [EMAIL PROTECTED] To: Java konference@java.cz Sent: Thursday, July 27, 2006 4:11 PM Subject: Re: equals a hashCode (WAS: java.security.Permission) no equals a hashcode uz chapu ;-) jeste jedna otazka ohledne kolekci, muze kolekce Map mit pro jeden klic vice objektu? - Original Message - From: Stanislav Ošmera [EMAIL PROTECTED] To: Java konference@java.cz Sent: Thursday, July 27, 2006 4:04 PM Subject: Re: equals a hashCode (WAS: java.security.Permission) Mimo jine se doporucuje aby funkce ktera vraci hashcode byla velmi jednoducha a rychla protoze se pouzije jako prvni a nejcasteji (kdyz je ruzny hashcode tak se jiz dale nic nezjistuje) A az pak funkce equals muze byt velmi slozita na vyhodnoceni. Napriklad mam slozity objekt ktery ma spoustu atributu. Hashcode vytvorim jen treba pouzitim 3 z nich ktery jsou primitivni typy, kdezto pri equals porovnavam vsechny atributy a to u nekterych muze znamenat porovnavani jinych objektu s podobnou slozitosti. Ale opravdu bude lepe si precist nejakou knizku o tehlech hlavnich algoritmickych myslenkach ktere jsou v Jave, ten zminovany Bloch je treba zrovna na tohle vyborny. P.S. jinak tomu spojeni equal a hashCode se rika equals contract -- Stanislav Ošmera Work: +44 (0)2075 980 348 Cell: +44 (0)7914 635 412 !DSPAM:44c8c935124803984916995!
java.security.Permission
Dobry vecer, prokousavam se bezpecnosti v Jave a narazil jsem na tridu Permission. Rad bych si napsal svou vlastni implementaci, ale trochu me desi nektere metody, oznacene, jako abstraktni, napriklad mi neni jasne, proc by mel Permission objekt povinnereimplementovat metodu hashcode a equals, to equals bych mozna jeste pochopil, ale hashcode mi prijde jako uplna blbost.
Re: java.security.Permission
Nazdar, strucne co si pamatuji z knizky 57 rad efektivne v JAVe (nebo obdobne) od Blochua, tak to vychazi ze zakladu jedinecnosti objektu a zpusobu jeho porovnavani ve virtualnim stroji. Tyto metody se dedi primo z tridy Object a maji je implementovane vsechny tridy. pravidlo je takove, ze equals zajistuje shodu na urovni aplikace a hashcode na urovni VM = v ruznych instancich VM hashcode myslim muze byt ruzny, zatimco equals je vzdy stejne, ale nejsem si tim ted jisty:( Plati vsak, pokud se reimplementuje equals, tak se musi reimplementovat i hashcode Lumi(r) Kamzik-II wrote: Dobry vecer, prokousavam se bezpecnosti v Jave a narazil jsem na tridu Permission. Rad bych si napsal svou vlastni implementaci, ale trochu me desi nektere metody, oznacene, jako abstraktni, napriklad mi neni jasne, proc by mel Permission objekt povinne reimplementovat metodu hashcode a equals, to equals bych mozna jeste pochopil, ale hashcode mi prijde jako uplna blbost.
Re: java.security.Permission
No tak to mi potom neni vubec jasne, proc bych to mel reimplementovat - Original Message - From: Lumír Návrat [EMAIL PROTECTED] To: Java konference@java.cz Sent: Wednesday, July 26, 2006 9:14 PM Subject: Re: java.security.Permission Nazdar, strucne co si pamatuji z knizky 57 rad efektivne v JAVe (nebo obdobne) od Blochua, tak to vychazi ze zakladu jedinecnosti objektu a zpusobu jeho porovnavani ve virtualnim stroji. Tyto metody se dedi primo z tridy Object a maji je implementovane vsechny tridy. pravidlo je takove, ze equals zajistuje shodu na urovni aplikace a hashcode na urovni VM = v ruznych instancich VM hashcode myslim muze byt ruzny, zatimco equals je vzdy stejne, ale nejsem si tim ted jisty:( Plati vsak, pokud se reimplementuje equals, tak se musi reimplementovat i hashcode Lumi(r) Kamzik-II wrote: Dobry vecer, prokousavam se bezpecnosti v Jave a narazil jsem na tridu Permission. Rad bych si napsal svou vlastni implementaci, ale trochu me desi nektere metody, oznacene, jako abstraktni, napriklad mi neni jasne, proc by mel Permission objekt povinne reimplementovat metodu hashcode a equals, to equals bych mozna jeste pochopil, ale hashcode mi prijde jako uplna blbost.
Re: java.security.Permission
No klasicky priklad se uvadi u entitnich objektu, kdy si predstav, ze mas vytisk knihy, ten je identifikovan jednak cislem titulu a dale prirustkovym cislem v ramci daneho titulu. Pokud by jsi pouzil defaultni implementaci, tak by se to porovnavalo pouze na rovnost instanci. To znamena, ze pokud by jsi udelal: Vytisk v1 = new Vytisk(123455,1/2006); Vytisk v2 = new Vytisk(123455,2/2006); v1.equals(v2); // vysledek je false, jelikoz: v1 = this, v2 = object a telo metody equals obsahuje return this == object, coz je porovnavani adres instacni. Proto je nutne provest nasledujici reimplementaci: public boolean equals(Object object) { if (object == null) { return false; } if (object instanceof Vytisk) { Vytisk pomV = (Vytisk)object) return this.id == pomV prirustek.equals(pomV.prirustek); } return false; } Samotna implementace hashcode sice neni zivotne nutna, ale je s ruznych duvodu, ktere si jiz nepamatuji doporucena. Lumi(r) Kamzik-II wrote: No tak to mi potom neni vubec jasne, proc bych to mel reimplementovat - Original Message - From: Lumír Návrat [EMAIL PROTECTED] To: Java konference@java.cz Sent: Wednesday, July 26, 2006 9:14 PM Subject: Re: java.security.Permission Nazdar, strucne co si pamatuji z knizky 57 rad efektivne v JAVe (nebo obdobne) od Blochua, tak to vychazi ze zakladu jedinecnosti objektu a zpusobu jeho porovnavani ve virtualnim stroji. Tyto metody se dedi primo z tridy Object a maji je implementovane vsechny tridy. pravidlo je takove, ze equals zajistuje shodu na urovni aplikace a hashcode na urovni VM = v ruznych instancich VM hashcode myslim muze byt ruzny, zatimco equals je vzdy stejne, ale nejsem si tim ted jisty:( Plati vsak, pokud se reimplementuje equals, tak se musi reimplementovat i hashcode Lumi(r) Kamzik-II wrote: Dobry vecer, prokousavam se bezpecnosti v Jave a narazil jsem na tridu Permission. Rad bych si napsal svou vlastni implementaci, ale trochu me desi nektere metody, oznacene, jako abstraktni, napriklad mi neni jasne, proc by mel Permission objekt povinne reimplementovat metodu hashcode a equals, to equals bych mozna jeste pochopil, ale hashcode mi prijde jako uplna blbost.
Re: java.security.Permission
Hm asi mate v tomhle pravdu :) Jak se vyznate s Permission? Nemohl byste mi poradit nejakej fine tutorial, kde je popsana tvorba vlastni implementace? BtW: Diky - Original Message - From: Lumír Návrat [EMAIL PROTECTED] To: Java konference@java.cz Sent: Wednesday, July 26, 2006 10:16 PM Subject: Re: java.security.Permission No klasicky priklad se uvadi u entitnich objektu, kdy si predstav, ze mas vytisk knihy, ten je identifikovan jednak cislem titulu a dale prirustkovym cislem v ramci daneho titulu. Pokud by jsi pouzil defaultni implementaci, tak by se to porovnavalo pouze na rovnost instanci. To znamena, ze pokud by jsi udelal: Vytisk v1 = new Vytisk(123455,1/2006); Vytisk v2 = new Vytisk(123455,2/2006); v1.equals(v2); // vysledek je false, jelikoz: v1 = this, v2 = object a telo metody equals obsahuje return this == object, coz je porovnavani adres instacni. Proto je nutne provest nasledujici reimplementaci: public boolean equals(Object object) { if (object == null) { return false; } if (object instanceof Vytisk) { Vytisk pomV = (Vytisk)object) return this.id == pomV prirustek.equals(pomV.prirustek); } return false; } Samotna implementace hashcode sice neni zivotne nutna, ale je s ruznych duvodu, ktere si jiz nepamatuji doporucena. Lumi(r) Kamzik-II wrote: No tak to mi potom neni vubec jasne, proc bych to mel reimplementovat - Original Message - From: Lumír Návrat [EMAIL PROTECTED] To: Java konference@java.cz Sent: Wednesday, July 26, 2006 9:14 PM Subject: Re: java.security.Permission Nazdar, strucne co si pamatuji z knizky 57 rad efektivne v JAVe (nebo obdobne) od Blochua, tak to vychazi ze zakladu jedinecnosti objektu a zpusobu jeho porovnavani ve virtualnim stroji. Tyto metody se dedi primo z tridy Object a maji je implementovane vsechny tridy. pravidlo je takove, ze equals zajistuje shodu na urovni aplikace a hashcode na urovni VM = v ruznych instancich VM hashcode myslim muze byt ruzny, zatimco equals je vzdy stejne, ale nejsem si tim ted jisty:( Plati vsak, pokud se reimplementuje equals, tak se musi reimplementovat i hashcode Lumi(r) Kamzik-II wrote: Dobry vecer, prokousavam se bezpecnosti v Jave a narazil jsem na tridu Permission. Rad bych si napsal svou vlastni implementaci, ale trochu me desi nektere metody, oznacene, jako abstraktni, napriklad mi neni jasne, proc by mel Permission objekt povinne reimplementovat metodu hashcode a equals, to equals bych mozna jeste pochopil, ale hashcode mi prijde jako uplna blbost.
Re: java.security.Permission
Ja bych teda pouzil javadoc, kde jsem se vysvetleni dobral naprosto v pohode ... The required hashCode behavior for Permission Objects is the following: * Whenever it is invoked on the same Permission object more than once during an execution of a Java application, the hashCode method must consistently return the same integer. This integer need not remain consistent from one execution of an application to another execution of the same application. * If two Permission objects are equal according to the equals method, then calling the hashCode method on each of the two Permission objects must produce the same integer result. Nevim proc jsou tyto pozadavky, ale jsou. Standardni implementace hashcode vychazi z toho, jak je objekt alokovan, tj. kde v heapu je a proto ma kazda instance jiny hash, zda ho pozaduji mit stejny i napric ruznymi instancemi JVM. Proto si jej musite implementovat sam ... Priste se mrknete do javadoc a pak se ptejte :-) Kamzik-II napsal(a): Hm asi mate v tomhle pravdu :) Jak se vyznate s Permission? Nemohl byste mi poradit nejakej fine tutorial, kde je popsana tvorba vlastni implementace? BtW: Diky - Original Message - From: Lumír Návrat [EMAIL PROTECTED] To: Java konference@java.cz Sent: Wednesday, July 26, 2006 10:16 PM Subject: Re: java.security.Permission No klasicky priklad se uvadi u entitnich objektu, kdy si predstav, ze mas vytisk knihy, ten je identifikovan jednak cislem titulu a dale prirustkovym cislem v ramci daneho titulu. Pokud by jsi pouzil defaultni implementaci, tak by se to porovnavalo pouze na rovnost instanci. To znamena, ze pokud by jsi udelal: Vytisk v1 = new Vytisk(123455,1/2006); Vytisk v2 = new Vytisk(123455,2/2006); v1.equals(v2); // vysledek je false, jelikoz: v1 = this, v2 = object a telo metody equals obsahuje return this == object, coz je porovnavani adres instacni. Proto je nutne provest nasledujici reimplementaci: public boolean equals(Object object) { if (object == null) { return false; } if (object instanceof Vytisk) { Vytisk pomV = (Vytisk)object) return this.id == pomV prirustek.equals(pomV.prirustek); } return false; } Samotna implementace hashcode sice neni zivotne nutna, ale je s ruznych duvodu, ktere si jiz nepamatuji doporucena. Lumi(r) Kamzik-II wrote: No tak to mi potom neni vubec jasne, proc bych to mel reimplementovat - Original Message - From: Lumír Návrat [EMAIL PROTECTED] To: Java konference@java.cz Sent: Wednesday, July 26, 2006 9:14 PM Subject: Re: java.security.Permission Nazdar, strucne co si pamatuji z knizky 57 rad efektivne v JAVe (nebo obdobne) od Blochua, tak to vychazi ze zakladu jedinecnosti objektu a zpusobu jeho porovnavani ve virtualnim stroji. Tyto metody se dedi primo z tridy Object a maji je implementovane vsechny tridy. pravidlo je takove, ze equals zajistuje shodu na urovni aplikace a hashcode na urovni VM = v ruznych instancich VM hashcode myslim muze byt ruzny, zatimco equals je vzdy stejne, ale nejsem si tim ted jisty:( Plati vsak, pokud se reimplementuje equals, tak se musi reimplementovat i hashcode Lumi(r) Kamzik-II wrote: Dobry vecer, prokousavam se bezpecnosti v Jave a narazil jsem na tridu Permission. Rad bych si napsal svou vlastni implementaci, ale trochu me desi nektere metody, oznacene, jako abstraktni, napriklad mi neni jasne, proc by mel Permission objekt povinne reimplementovat metodu hashcode a equals, to equals bych mozna jeste pochopil, ale hashcode mi prijde jako uplna blbost. -- Jiří Mareš (mailto:[EMAIL PROTECTED]) ČSAD SVT Praha, s.r.o. (http://www.svt.cz) Czech Republic