Vector.set()和ArrayList.set()中的不同行为的说明

时间:2011-08-02 21:20:32

标签: java vector arraylist

除了项目背景,我已经实现了一个自定义JComboBoxes的表。 ComboBoxes的每一行都是独占的:虽然每个ComboBox都有自己的模型(允许不同的选择),但每行只能选择一次。这是通过在选择时在项目的前面添加标记并在取消选择时再次删除它来完成的。如果用户尝试选择标记的项目,则不会发生任何事情。

但是,这仅在使用Vector作为选项列表的后盾时才有效。我可以得到字符串的向量,使用set()或setElementAt(),并且它可以运行。

但是,使用ArrayList而不是Vector,这根本不起作用。我的印象是ArrayLists的功能类似,因为我可以检索匿名ArrayList,更改其内容,依赖于该ArrayList内容的所有其他对象将相应地更新,就像Vector实现一样。

我希望有人可以告诉我为什么这会有所不同,因为Vector和ArrayList都实现了List,并且据说应该有类似的行为。

编辑:

感谢您的快速回复!所有答案都是指ArrayList和Vector之间的同步差异。但是,我的项目没有显式创建新线程。这可能是我的数据和Swing线程之间的同步问题吗?我对线程不太了解......

第二次编辑:

再次感谢大家!数据和Swing之间的同步很容易回答我的问题,但是如果有更多的话,我仍然会对更多细节感兴趣。

4 个答案:

答案 0 :(得分:1)

我怀疑差异是由于Vector是线程安全的而ArrayList没有。这会影响其元素更改对不同线程的可见性。当您更改Vector中的元素时,更改会立即显示给其他线程。 (这是因为它的方法使用锁来同步,这会创建一个内存屏障,有效地将线程内存的当前状态 - 包括其中的最新更改 - 与其他线程的状态同步。)但是,使用ArrayList这样的同步不会自动发生,因此一个线程所做的更改可能仅在以后(并且以任意顺序)对其他线程可见,或者根本不可见。

由于Swing本质上是多线程的,因此您需要确保在不同(工作线程,UI)线程之间可以看到数据更改。

答案 1 :(得分:1)

Vector已同步。它使用synchronized关键字来确保访问它的所有线程都看到一致的结果。 ArrayList未同步。当一个线程设置ArrayList的元素时,不能保证另一个线程将看到更新。

答案 2 :(得分:0)

对Vector元素的访问是同步的,而不是对ArrayList的访问。如果您有不同的线程访问和修改列表,您将看到两者之间的不同行为。

答案 3 :(得分:0)

我没有时间测试这段代码,而且你的代码示例仍然很轻(一个很好的全功能样本会更有帮助 - 我不想写一个完整的应用来测试这个)但是我我愿意打赌,如果你把你的电话包裹在'setSelectDeselect'(如你的粘贴器中所示),那么ArrayListVector一样有效:

Runnable selectRunnable = new Runnable() 
{
  public void run()
  {
    setSelectDeselect(cat, itemName, selected);
  }
};

SwingUtilities.invokeLater(selectRunnable);

您正在事件处理过程中更新ArrayList。上述代码将推迟更新,直到事件完成。我怀疑在这里还有其他的东西可以通过查看你的其余代码来表现出来。