Lista não ordenada, qual?

Olá pessoal!

Eu to precisando de uma lista não ordenada, onde vou inserindo objetos e depois retiro todos de uma só vez…

Qual a opção pronta mais eficiente?

Valeuuu!

Você quer “retirar todos” como? Limpar a lista de uma vez só (list.clear()) ou ir retirando um por um, em ordem de inserção (a partir do mais antigo), ou em ordem contrárioa de inserção (a partir do mais recente)?

Eu preciso de uma estrutura para ir guardando objetos. Eu não sei a priori o número de objetos que irei guardar. Então basicamente o que eu preciso é de um array que aumente de tamanho quando chegar no limite. E depois na hora de consultar eu vou olhar todos de uma só vez, mas esses objetos devem permanecer na estrutura para consultas futuras. A ordem não faz diferença alguma.

Eu implementei um tipo de lista por contiguidade, que quando chega no limite do array ela dobra de tamanho e copia os objetos para o novo array. Isso é mais eficiente que o ArrayList… Tem alguma estrutura pronta que seja mais eficiente que isso que implementei?

Valeu pessoal!!!

ArrayList faz mais ou menos o que você já estava fazendo, só que ele aumenta o array interno só de 50%, em vez de criar um array com o dobro da capacidade, como você fez.
A rotina “add” de ArrayList chama sempre ensureCapacity, que está no Javadoc. Só para refrescar a sua memória:

    public void ensureCapacity(int minCapacity) {
	modCount++;
	int oldCapacity = elementData.length;
	if (minCapacity > oldCapacity) {
	    Object oldData[] = elementData;
	    int newCapacity = (oldCapacity * 3)/2 + 1;
    	    if (newCapacity < minCapacity)
		newCapacity = minCapacity;
	    elementData = new Object[newCapacity];
	    System.arraycopy(oldData, 0, elementData, 0, size);
	}
    }

Hmm… Blz… Não vou mexer então, já que está mais eficiente…

Thingol, aproveitando que vc está me lendo, vou fazer outra pergunta:

Eu tenho um método que dentro dele eu faço algo do tipo:

nodosAbertos = new PriorityQueue<Nodo> (numNodos, comparator);

Sendo que abertos é um membro privado da classe

Quando chamo esse método pela primeira vez, esse new gasta em torno de 10 vezes mais tempo que da segunda vez. Porque?!

Valeuuuu!

Isso é um artefato daquelas famosas características da JVM (para carregar uma classe é obrigada a olhar o classpath inteirinho, o que leva um certo tempo, e então depois de uma quantidade X de invocações de um mesmo método a JVM resolve compilar o método para código nativo (Hotspot -> Just-In-Time compiler).

Então a primeira vez que você instancia um objeto de uma determinada classe - não importa qual seja ela - vai demorar mesmo, e você pode ter uma surpresa ao medir o tempo de execução de uma determinada rotina, porque ela pode repentinamente ficar muito mais rápida - mas antes disso, na milésima invocação, ela demorar muito porque está sendo feita a compilação para código nativo. (Estou dando o número 1000 só como exemplo. Esse número depende de alguns parâmetros da JVM - se for em modo -server é uma coisa, em modo -client é outra coisa e de alguns parâmetros de linha de comando, como -XX:CompileThreshold ou -Xcomp.

hmmm!!! Muito legal cara! Essa dúvida tava martelando a minha cabeça a alguns dias!

Muito obrigado!!!