Uvedene kontrakty plati pouze tehdy, pokud se hashCode() u klice v hasmape 
(HashMap, Hashtable, HashSet) nemeni.
Zcela jasne to plyne z implementace a vubec principu fungovani.

Pokud to neni uvedeno v javadocu (take jsem nenasel, ale zas tolik jsem 
nehledal), tak je to BUG v javadocu a asi by se mel reportovat.

Kamil Podlesak

> -----Original Message-----
> From: [EMAIL PROTECTED] 
> [mailto:[EMAIL PROTECTED] Behalf Of Stöhr 
> Miroslav RNDr. Ph.D.
> Sent: Wednesday, May 23, 2007 12:05 PM
> To: Java
> Subject: RE: hashset contains wtf
> 
> 
> Děkuji za objasnění zajímavé vlastnosti těchto objektů, které 
> jsem si prozatím nebyl vědom. Jenom mi není jasné následující:
> 
> 1/ Set.contains(Object o)
> Returns true if this set contains the specified element. More 
> formally, returns true if and only if this set contains an 
> element e such that (o==null ? e==null : o.equals(e)). 
> 
> Tento obecný kontrakt musí splňovat i HashSet, který 
> používáme v příkladě.
> 
> 2/ Z toho plyne, že metoda contains() v uvedeném příkladě 
> volá metodu Map.equals. U té je uvedeno: 
> Compares the specified object with this map for equality. 
> Returns true if the given object is also a map and the two 
> Maps represent the same mappings. More formally, two maps t1 
> and t2 represent the same mappings if 
> t1.entrySet().equals(t2.entrySet()). This ensures that the 
> equals method works properly across different implementations 
> of the Map interface. 
> 
> Tento obecný kontrakt musí splňovat HashMap, který používáme 
> v příkladě.
> 
> Ať čtu jak čtu, to co jste uvedl (že měnit hashcode objektu v 
> mapě nelze) tam nevidím. Je pravda, že HashMap.hashCode() se 
> zmení, ale pokud je i nadále splněn obecný kontrakt 
> hashCode() (tj. že musí být v souladu s equals(), a to je), 
> obecné kontrakty by měly platit jak před změnou, tak po změně.
> 
> Mohl bych poprosit o objasnění?
> 
>                 Mirek
> 
> 
> -----Original Message-----
> From: [EMAIL PROTECTED] 
> [mailto:[EMAIL PROTECTED] On Behalf Of Podlesak Kamil
> Sent: Wednesday, May 23, 2007 11:39 AM
> To: Java
> Subject: RE: hashset contains wtf
> 
> 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.
> > 
> 

Odpovedet emailem