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.
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 ?
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).