Qual é a melhor maneira de setListData em uma JList, vetor ou matriz?
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.
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)