【问题标题】:Which is the better way to setListData in a jList, vector or array?在 jList、向量或数组中 setListData 的更好方法是什么?
【发布时间】:2009-06-05 01:06:45
【问题描述】:

this 中回答我提出的问题。 Kathy Van Stone 说像这样添加一个数组

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

比这样做更好的方法

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

我想知道这是否有任何真相,如果是这样,背后的原因是什么。

【问题讨论】:

    标签: java hashmap jlist


    【解决方案1】:

    您需要Vector 类提供的同步吗?如果没有,那么您不想使用 Vector 类。 (如果只有 JList 允许使用 ArrayList 代替它。)在最近的 JVM 版本中,非竞争同步的成本低,远低于过去。不过,没有理由使用不必要的同步。

    看起来 Kathy Van Stone 可能指的是 Vector 中的额外同步。

    仔细注意public JList(Vector&lt;?&gt; 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 构造函数版本进行相同的更改。

    【讨论】:

    • 最好始终保持安全并实例化新的向量/对象......除非你真的负担不起创建一个额外的对象
    • 无论你是在创建一个对象 - 一个数组还是一个向量,这只是一个问题,即哪个更有效地迭代和创建。直觉说数组,但实际上是为了测试。
    • @Yishai:是的,如果你真的很在意时机,那就分析一下吧。但是由于向量是同步的(并且在内部由数组支持,对吗?),如果纯数组更慢,我会感到惊讶。
    【解决方案2】:

    看看 JList 类中这两个 setListData 方法的实现,你会发现这并不重要。 我更喜欢第一个,只是因为不需要涉及另一个集合(矢量)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      • 2013-07-10
      • 2014-05-03
      • 2018-10-11
      • 2012-10-23
      相关资源
      最近更新 更多