2009-06-05 2 views
0

에서 this 질문에 대한 답변을 부탁드립니다. Kathy Van Stone 그렇게jList, 벡터 또는 배열에서 setListData를 사용하는 더 좋은 방법은 무엇입니까?

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

같은 배열을 추가하는 것은이 어떤 진실이 있다면 나는 궁금이

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

처럼 작업을 수행하는 것보다 만일 그렇다면 더 나은 방법이라고 말하는 그 뒤에 이유 였다.

답변

3

Vector 클래스에서 제공하는 동기화가 필요합니까? 그렇지 않다면 Vector 클래스를 사용하고 싶지 않습니다. (그 대신에 ArrayList을 사용하면 JList 만 허용됩니다.) 최근 JVM 버전에서 비 동시성 동기화 비용이 방법보다 낮습니다. 여전히 불필요한 동기화를 사용할 이유가 없습니다.

Kathy Van Stone이 Vector에서 추가 동기화를 언급 한 것처럼 보입니다.

참고 조심스럽게 public JList(Vector<?> listData)에 대한 JavaDoc을 :

생성 된 모델은 직접 주어진 벡터를 참조합니다. 목록을 구성한 후 벡터를 수정하려고하면 정의되지 않은 동작이 발생합니다.

불행하게도, public JList(Object[] listData)에 대한 javadoc에서는 같은 경고가 있습니다

생성 된 모델은 직접 지정된 배열을 참조합니다. 목록을 구성한 후에 배열을 수정하려고하면 정의되지 않은 동작이 발생합니다.

당신은 누군가가 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 constructor 버젼과 같은 변경.

+0

항상 안전한쪽에 있고 새로운 벡터/개체를 인스턴스화하는 것이 더 좋을 것입니다 ... 실제로 하나의 여분의 개체를 만들 여유가 없다면 –

+0

어떤 방식 으로든 배열이나 vectory를 만들거나, 그것은 단지 반복 작성하고 작성하는 것이 더 효율적이라는 것입니다. Intuition은 배열을 말하지만 실제로 테스트는 순서대로 진행됩니다. – Yishai

+0

@Yishai : 사실, 타이밍을 중요하게 생각하면 프로필을 작성하십시오. 그러나 벡터가 동기화 되었기 때문에 (내부적으로 배열에 의해 뒷받침됩니다.) 순수 배열이 더 느리면 놀랍습니다. – Eddie

1

JList 클래스에서 두 setListData 메소드의 구현을 살펴보면 실제로 중요하지 않음을 알 수 있습니다. 다른 컬렉션 (벡터)을 사용할 필요가 없으므로 첫 번째 컬렉션을 선호합니다.