2009-06-05 2 views
0

В this ответ на вопрос, который я задал. Kathy Van Stone говорит, что добавление массива как такКаков наилучший способ setListData в jList, vector или array?

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

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

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

Я задаюсь вопросом, есть ли правда в этом и если это так, что причина этого был.

ответ

3

Вам нужна синхронизация, предоставляемая классом 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 

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

+0

Возможно, лучше всегда быть в безопасности и создавать новый вектор/объект ... если вы действительно не можете позволить себе создать один дополнительный объект –

+0

В любом случае вы делаете объект - массив или vectory, это просто вопрос, какой из них более эффективен для итерации и создания. Интуиция говорит массив, но на самом деле тест в порядке. – Yishai

+0

@Yishai: Верно, если вы действительно заботитесь о сроках, а затем профиль его. Но поскольку векторы синхронизированы (и внутренне поддерживаются массивом, верно?), Я был бы удивлен, если бы чистый массив был медленнее. – Eddie

1

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

Смежные вопросы