选择 Java 集合实现的经验法则?

2022-08-31 15:46:56

有没有人有很好的经验法则来选择Java集合接口的不同实现,如List,Map或Set?

例如,通常为什么或在什么情况下我更喜欢使用Vector或ArrayList,Hashtable或HashMap?


答案 1

我真的很喜欢Sergiy Kovalchuk博客文章中的这个备忘单,但不幸的是它是离线的。但是,Wayback Machine有一个历史副本

Java Map/Collection Cheat Sheet

更详细的是Alexander Zagniotov的流程图,也离线了博客的历史副本

Alexander Zaniotov's flowchart for choosing Collection implementations

博客摘录了评论中提出的问题:“这个备忘单不包括很少使用的类,如WeakHashMap,LinkedList等,因为它们是为非常具体或异国情调的任务而设计的,不应该在99%的情况下选择。


答案 2

我假设您从上面的答案中知道列表,设置和地图之间的区别。为什么你会在他们的实现类之间进行选择是另一回事。例如:

列表

  1. ArrayList 检索速度快,但插入速度慢。这对于读取很多但不插入/删除很多的实现是很好的。它将其数据保存在一个连续的内存块中,因此每次需要扩展时,它都会复制整个阵列。
  2. LinkedList检索速度很慢,但插入速度很快。这对于插入/删除很多但读不多的实现是很好的。它不会将整个阵列保存在一个连续的内存块中。

设置:

  1. HashSet不保证迭代的顺序,因此是集合中最快的。它具有很高的开销并且比ArrayList慢,因此除了大量数据之外,当它的哈希速度成为一个因素时,您不应该使用它。
  2. TreeSet保持数据有序,因此比HashSet慢。

地图:HashMap 和 TreeMap 的性能和行为与 Set 实现并行。

不应使用 Vector 和 Hashtable。它们是同步实现,在发布新的集合层次结构之前,因此速度很慢。如果需要同步,请使用 Collections.synchronizedCollection()。