Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Vector.set()和ArrayList.set()中不同行为的解释_Java_Vector_Arraylist - Fatal编程技术网

Java Vector.set()和ArrayList.set()中不同行为的解释

Java Vector.set()和ArrayList.set()中不同行为的解释,java,vector,arraylist,Java,Vector,Arraylist,撇开项目背景不谈,我已经实现了一个定制JComboxes表。每行组合框都是独占的:虽然每一个组合框都有自己的模型(允许不同的选择),但每行只能选择一次。这是通过在选中时将标记添加到项目的前面,然后在取消选中时再次将其删除来完成的。如果用户尝试选择标记的项目,则不会发生任何事情 但是,这仅在使用向量作为选项列表的支持时有效。我可以得到字符串的向量,使用set()或setElementAt(),然后boom presto就可以了 但是,如果使用ArrayList而不是Vector,这根本不起作用。我

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

但是,这仅在使用向量作为选项列表的支持时有效。我可以得到字符串的向量,使用set()或setElementAt(),然后boom presto就可以了

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

我希望有人能告诉我为什么这是不同的,因为Vector和ArrayList都实现了List,应该有类似的行为

编辑:

感谢您的及时回复!所有答案都涉及ArrayList和Vector之间的同步差异。但是,我的项目并没有显式地创建新线程。这是否可能是我的数据和Swing线程之间的同步问题?我的线程不够好,不知道

第二次编辑:


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

我怀疑差异是由于
Vector
是线程安全的,而
ArrayList
不是。这会影响其元素的更改对不同线程的可见性。当您更改
向量中的元素时,其他线程会立即看到该更改。(这是因为它的方法是使用锁进行同步的,锁会造成内存障碍,有效地将线程内存的当前状态(包括最新的更改)与其他线程的状态同步。)但是,对于
ArrayList
,这种同步不会自动发生,因此,一个线程所做的更改可能只在以后(以任意顺序)对其他线程可见,或者根本不可见


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

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

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

我没有时间测试这段代码,而且您的代码示例仍然非常简单(一个很好的全功能示例会更有帮助-我不想编写一个完整的应用程序来测试这段代码)但我敢打赌,如果您像这样包装对“setSelectDeselect”(如粘贴箱中所示)的调用,那么
ArrayList
将与
Vector
一样工作:

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

SwingUtilities.invokeLater(selectRunnable);

<>你在事件处理的中间更新你的数组。上述代码将延迟更新,直到事件完成。我怀疑这里还有其他一些东西在起作用,从查看代码的其余部分可以明显看出。

正如其他人所发布的,Vector是线程安全的,而ArrayList不是。但看起来你的应用程序不是多线程的。那么,请你再解释一下问题(发生了什么,代码)代码!如果您可以在不使用Swing的情况下复制此问题,那就更好了。下面是选择方法代码:抱歉,我无法确定StackOverflow的格式。。。唯一的区别是“vect”是ArrayList而不是Vector。