在this回答我提出的问题。 Kathy Van Stone说添加类似的数组
jList1.setListData(LinkedHashMap.keySet().toArray());
比这样做更好的方式
jList1.setListData(new Vector<String>(LinkedHashMap.keySet()));
我想知道这是否有任何道理,如果是这样,背后的原因是什么。
答案 0 :(得分:3)
您是否需要Vector
班级提供的同步?如果没有,那么您不想使用Vector
类。 (如果只允许JList
使用ArrayList
。)在最近的JVM版本中,无竞争同步的成本 way 更低,比以前低。但是,没有理由使用不必要的同步。
看起来Kathy Van Stone可能指的是Vector
中的额外同步。
请注意public JList(Vector<?> listData)
的JavaDoc:
创建的模型直接引用给定的Vector。试图修改 构造列表后的向量导致未定义的行为。
不幸的是,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构造函数版本相同的更改。
答案 1 :(得分:1)
看一下JList类中两个setListData方法的实现,你会发现它确实没关系。 我更喜欢第一个,因为没有必要涉及另一个集合(Vector)