如果线程安全性不是问题,则使用Java中的ArrayList与Vectors

Rya*_*mes 28 java collections performance

性能VectorArrayList?之间真的有那么大差异吗?当线程安全不成问题时,始终使用ArrayLists是一种好习惯吗?

Chr*_* P. 40

Vector源于预收集API时代,并且自从成为其中的一部分后进行了改造.从我所读到的,它不被弃用的原因是因为核心API依赖于它.

ArrayList是作为Collections API的一部分从头开始编写的,因此除非您需要支持低至1.2的Java版本,否则应该使用它.

如果需要线程安全的ArrayList,可以使用静态工厂方法Collections.synchronizedList(new ArrayList<type>);生成列表.

  • 是的,除非你的目标是J2ME/pre 1.2 J2SE,否则使用ArrayList. (2认同)

Aar*_*ron 15

如果线程安全不是问题,ArrayList则更快,因为它不必同步.虽然,您应该始终将变量声明为,List以便稍后可以根据需要更改实现.

我更喜欢明确地处理我的同步,因为很多操作需要多次调用.例如:

if (!myList.isEmpty()) { 
    myList.get(0);
}
Run Code Online (Sandbox Code Playgroud)

应该:

synchronized (myList) {
   if (!myList.isEmpty()) { 
       myList.get(0);
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 依赖于synchnizedList包装是在这些多次调用情况下犯的常见错误,并且导致很难找到错误,因为您认为已经正确地完成了错误... (2认同)

bru*_*nde 9

如果线程安全不是问题,则应始终使用ArrayList.向量具有同步的开销,并且已经表明之间的性能差异ArrayListVector是深不可测的.你可以谷歌搜索很多性能基准测试.

这是一个时间和性能.


Jam*_*hek 5

忽略同步,之间的主要区别VectorArrayListVector是一个可调整大小的阵列(类似于C++ STL向量),并ArrayList是恰好由阵列被备份列表.

差异在setSize()方法中体现出来.没有等效的方法ArrayList.一些前C++ Java开发人员对此持怀疑态度.有很多简单的方法可以解决它,所以它应该不是问题.

只是不要告诉C++开发人员一个ArrayList等同于a的错误std::vector.你永远不会听到它的结束.