Pegadinha no exame

Sim, HashSet não tem qualquer garantia de ordem.

O algoritmo que ele usa é, a grosso modo, descrito assim:

Crie um array, de um tamanho qualquer, onde cada índice desse array é uma lista de objetos.
Ao inserir um objeto:
Divida o hashcode desse objeto pelo tamanho do array, e pegue a parte inteira.
Na posição do resultado, adicione esse objeto na lista, se ele já não estiver lá.

Exemplo:

[code]
//Criamos um array:
List<Object> array[100] = new List<Object>[100];

//Ao adicionar o elemento de hashcode 2109
int pos = elemento.hashCode() / array.length; //pos = 2109 / 100 = 21;
if (array[pos].contains(elemento))
return; //Não adicionamos nada

array[pos].add(elemento);[/code]

Note que, num hashcode bem implementado, haverá poucas colisões de hash, então a lista de cada posição ficará relativamente vazia.
Caso contrário, a lista pode encher e a performance certamente vai cair.

É claro que na prática é um pouco mais complicado que isso, já que a implementação na realidade se baseia na do Map, prevê o crescimento da lista em caso de colisões de hash, etc…

Mas acho que esse pseudo-código já ajuda a entender como seria um possível HashSet e porque é tão rápido.

PEssol suponha que eu tenha um metodo assim :

public class Base{
void print(Base e){

System.out.println("Base");
}
}

public Derived extends Base {

static void print(Derived e){

System.out.println("Derived");
}
}

A minha duvida e a seguinte para subscrição de metodo eu marcar um metodo com static, mas para sobrecarga sim ? Qual o efeito disso ? Como eu vou poder chamar o o metodo da classe Derived ?

Aí você tem 2 métodos, de assinaturas diferentes.

O primeiro, não estático, que recebe um objeto do tipo Base como argumento.
O segundo, estático, que recebe um do tipo Derived como argumento.

Para chamar o método de Derived você faz:

Raff, entenda que métodos sobrecarregados têm apenas o nome em comum. Não há nenhuma outra relação especial entre eles. A única “regra” é que, pra ser sobrecarga, eles devem ter o mesmo nome e não podem ter a mesma lista de parâmetros. Tirando isso, tudo que se aplica a um método qualquer aplica-se aos métodos sobrecarregados.

Assim sendo, nesse seu caso, vc nunca conseguirá chamar o método estatico sobrecarregado na subclasse a partir da superclasse, pois o método existe apenas na subclasse e a maneira como vc pode invocá-lo é como qualquer outro método static, seja da forma como o Vini colocou, que é a mais indicada, ou possivelmente instanciando um objeto da subclasse e invocando o método a partir de tal objeto (em ambos os casos passando como argumento uma instancia da subclasse).

[]'s

Valew Pessoal Dúvida exclarecida !!!

se vc mudar o tipo do argumento do metodo e manter o nome… ja era… aconteceu a sobrecarga :smiley: so para completar e ficar mais claro…
flw!!

Valew ia LPJava :mrgreen: