oi
fazendo um teste aqui me deparei com a seguinte situação
[code]Set strs = new HashSet();
strs.add(“C”);
strs.add(“A”);
strs.add(“B”);
strs.add(“C”);
strs.add(“C”);
for (Iterator iterator = strs.iterator(); iterator.hasNext()
{
String string = (String) iterator.next();
System.out.print(string+" ");
}
[/code]
utilizando java5 o resultado é A C B
utilizando java6 o resultado é A B C
segundo o tutorial HashSet garante apenas que não existe duplicidade - característica básica de Set - mas não ordenação, nesse caso eu poderia usar TreeSet - estrutura em árvore - ou LinkedHashSet
na verdade o add do HashSet internamente faz isso, onde map é um HashMap
public boolean add(E o) {
return map.put(o, PRESENT)==null;
}
olhei o source das duas versões, java5 e java6 e não vi diferenças de implementação, também busquei diferenças na implementação do interator e não vi nada de diferente
alguém poderia dizer porque da diferença??
abs
Bom, se dá diferente, então é mais um motivo para você não confiar na ordem.
Talvez haja alguma diferença no cálculo do hashCode na classe String nas duas versões, ou então o fator de carga (tamanho inicial do array interno onde são armazenadas as chaves do Hash table) seja um pouco diferente.
pois é como o thingol falou ^^ … a diferença pode estar na classe string, ou ate mesmo nos maps, ou em algum outro lugar de uma versão pra outra…
so seguir o diagrama => http://sergiotaborda.files.wordpress.com/2008/07/escolhacollection2.png
e ser feliz ^^
oi
sei que não posso confiar na ordenação do HashSet, a minha dúvida era achar onde eu tenho a diferença na implementação das versões que acarreta uma mudança na ordenação
o hashCode das duas versões de String são iguais, com relação ao parâmetro que o thingol falou nas duas versões de HashMap eu tenho DEFAULT_INITIAL_CAPACITY, MAXIMUM_CAPACITY e DEFAULT_LOAD_FACTOR também iguais e as validações no construtor também são iguais
para saber o que muda eu teria que debugar mesmo o fonte, se estiver curioso
legal o diagrama do Sérgio