从ArrayList更改为Vector

时间:2013-07-04 21:49:19

标签: java vector arraylist

我正在开发一款Android游戏,我注意到,因为onTouchEvent在UI线程上运行,而更新/渲染方法是从一个单独的线程运行的,所以它们都更新{{1}其中包含实体。显然,如果他们碰巧同时修改了列表,他们会发生冲突。

我读到ArrayList类与Vector完全相同,唯一的区别是ArrayList已同步,因此它们不会发生冲突。真的吗?如果是的话,它是否有任何性能问题或我应该关注的事情?我之前从未使用过Vector课程。

编辑: 我实际上的意思是改变

Vector

ArrayList<Obj> list = new ArrayList<Obj>();

但正如答案所说,不建议使用Vector<Obj> list = new Vector<Obj>()。选定的答案解决了我的问题。

4 个答案:

答案 0 :(得分:28)

对于那些必须与遗留代码作斗争的人,请执行以下操作:

new Vector<Obj>(anyThingWhichImplemntsCollection);

答案 1 :(得分:9)

这是老人Vector尝试不使用Vector而是使用

synchronizedList

示例:

list = Collections.synchronizedList(list);

Vector被认为已过时且已弃用,请阅读Why vector is considerer obsolete?

答案 2 :(得分:1)

List<Foo> list = new Vector<Foo>(new ArrayList<Foo>());  

应该有效。这两个结构都实现了List接口。

但正如其他人所说,这不是建议。

答案 3 :(得分:0)

正如nachokk已经提到的那样,synchonizedList将会成功。 synchronizedList将在您的列表周围返回一个包装器,因此不会进行复制 缺点是一次只能对列表进行一次调用。列表中的两个读取将是顺序的,即使它们可以并行完成。如果经常调用,同步块总是意味着一点开销并且会降低性能。

另一种选择是使用并发列表。这意味着首先是副本,但可以显着提高访问性能。 如果您有许多阅读请求(例如绘画),CopyOnWriteArrayList将是一个不错的选择。读取几乎与普通ArrayList一样快,不会被阻止。写入列表将是顺序且昂贵的,因为它们必须复制整个数组 CoWArrayList的另一个好处是,您可以在不捕获ConcurrentModificationException的情况下进行迭代。即使列表已更改,iterator()返回的迭代器也将始终使用相同的后备数组。