Какой лучший способ для setListData в jList, вектор или массив? - PullRequest
1 голос
/ 05 июня 2009

В это ответ на вопрос, который я задал. Кэти Ван Стоун говорит, что добавление массива выглядит так

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

это лучший способ, чем делать это так

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

Мне интересно, была ли в этом какая-то правда, и если да, то какова была причина этого.

Ответы [ 2 ]

3 голосов
/ 05 июня 2009

Вам нужна синхронизация, предоставляемая классом Vector? Если нет, то вы не хотите использовать класс Vector. (Если только JList разрешено использовать вместо него ArrayList.) Стоимость незапланированной синхронизации на способ ниже в последних версиях JVM, намного ниже, чем раньше. Тем не менее, нет причин использовать ненужную синхронизацию.

Похоже, Кэти Ван Стоун, возможно, имеет в виду эту дополнительную синхронизацию в Vector.

Обратите внимание на JavaDoc для public JList(Vector<?> listData):

Созданная модель напрямую ссылается на данный Вектор. Попытки изменить Вектор после построения списка приводит к неопределенному поведению.

К сожалению, JavaDoc для public JList(Object[] listData) имеет такое же предупреждение:

Созданная модель ссылается на данный массив напрямую. Попытки изменить массив после построения списка приводит к неопределенному поведению.

Вы должны решить, есть ли вероятность того, что кто-то решит, что Vector будет полезен позже тем же методом, и таким образом модифицирует код следующим образом:

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

... или, конечно, то же самое изменение с версией конструктора Array.

1 голос
/ 05 июня 2009

Посмотрите на реализацию обоих методов setListData в классе JList, и вы увидите, что это действительно не имеет значения. Я бы предпочел первый, просто потому что нет необходимости привлекать еще одну коллекцию (Вектор)

...