Pergunta

Na esta resposta a uma pergunta que fiz. Kathy Van Pedra diz que a adição de uma matriz como assim

jList1.setListData(LinkedHashMap.keySet().toArray());

é uma maneira melhor do que fazê-lo como este

jList1.setListData(new Vector<String>(LinkedHashMap.keySet()));

Eu estou querendo saber se havia alguma verdade nisso e se assim que a razão por trás que era.

Foi útil?

Solução

Você precisa de sincronização oferecida pela classe Vector? Se não, então você não quer usar a classe Vector. (Se apenas JList permitido usar um ArrayList em seu lugar.) O custo de sincronização uncontended é maneira diminuir em versões recentes do JVM, a maneira mais baixa do que costumava ser. Ainda assim, não há nenhuma razão para usar a sincronização desnecessário.

Parece que Kathy Van pedra pode estar se referindo a que a sincronização extra no Vector.

Note cuidadosamente o JavaDoc para public JList(Vector<?> listData) :

As referências modelo criado o dado vetor diretamente. As tentativas para modificar o Vector após a construção dos resultados da lista em um comportamento indefinido.

Infelizmente, o JavaDoc para public JList(Object[] listData) tem o mesmo aviso:

O modelo criado faz referência a matriz dada diretamente. As tentativas para modificar o matriz após a construção dos resultados da lista em um comportamento indefinido.

Você tem que decidir se há alguma probabilidade de que alguém decide que o Vector é útil mais tarde no mesmo método e, portanto, modifica o código como este:

Vector vec = new Vector<String>(LinkedHashMap.keySet());
jList1.setListData(vec);
// Other stuff with Vector
vec.add( .... ); // Adding some data type that fits in the Vector

... ou, claro, a mesma alteração com a versão construtor Array.

Outras dicas

Dê uma olhada na implementação de ambos os métodos setListData na classe JList e você vai ver que ele realmente não importa. Eu preferiria o primeiro, simplesmente porque não há necessidade de envolver ainda outra coleção (vetor)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top