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