Zdravim, To je proste: Map#hashCode() presne definuje ze vysledek musi byt vypocitan jako soucet hashcode vsech zaznamu. Pridanim noveho prvku se tedy zmeni hodnota hashCode.
Jenomze HashSet (resp. HashMap, kterou interne pouziva) zarazuje i hleda zaznamy podle hashCode(). Jakmile se hashCode zmeni, tak hleda jinde a nenajde. Plati obecne pravidlo: Objekty vkladane do hash mapy NESMI MENIT svuj hashCode()! Tedy alespon po dobu, co jsou v mape. Konkretne pak plati: Kolekce (Map, Collection) vlozene do hash mapy se NESMI MODIFIKOVAT. Pokud potrebujete mit v mnozine kolekce ktere bezne modifikujete, pouzijte IdentityHashMap. > -----Original Message----- > From: [EMAIL PROTECTED] > [mailto:[EMAIL PROTECTED] Behalf Of Tomas Zverina > Sent: Wednesday, May 23, 2007 11:24 AM > To: Java > Subject: hashset contains wtf > > > Zdravim, > > nekdo do me prosim vase kopnete, a vysvetlete mi, proc je vystup > nasledujiciho programu: > > import java.util.*; > > public class HashSetPokus { > > public static void main(String[] args) { > > { > // Experiment s HashSet > Map element1 = new HashMap(); > Set<Map> container1 = new HashSet<Map>(); > container1.add(element1); > System.out.println("1a: "+container1.contains(element1)); > container1.iterator().next().put("a", 123); > System.out.println("1b: "+container1.contains(element1)); > } > { > // Experiment s ArrayList > Map element2 = new HashMap(); > List<Map> container2 = new ArrayList<Map>(); > container2.add(element2); > System.out.println("2a: "+container2.contains(element2)); > container2.iterator().next().put("a", 123); > System.out.println("2b: "+container2.contains(element2)); > } > > } > > } > > takovyhle: > > 1a: true > 1b: false > 2a: true > 2b: true > > misto ocekavaneho: > > 1a: true > 1b: true > 2a: true > 2b: true > > Ja jsem z toho zverina. > > -- > S pozdravem, > > Tomas Zverina > > Multimedia atelier s.r.o. > Na Dolinách 4 > 147 00 Praha 4 > IČO: 25127071 > tel.: 241 433 120 > e-mail: [EMAIL PROTECTED] > http://www.m-atelier.cz/ > > Společnost Multimedia atelier s.r.o. je zapsána u > rejstříkového soudu v > Praze, oddíl C, vložka 51961. >
