Difference between List and Set in Java - TongtongLan/Java GitHub Wiki

List和Set的主要区别在于List是一个有序的Collection,而Set是一个无序的集合。 Java集合框架为各种需求提供了几个集合类,但是所有集合可以大致分为三类:List,Set和Map。 所有List,Set和Map被定义为接口,然后你有几个实现像ArrayList和Vector是List接口的流行实现,而HashSet是Set接口的一个流行的实现。 在这个java教程中,我们将主要看看顶层的List和Set集合有什么不同,以及如何选择何时使用List在java中以及何时使用Set in Java。

Difference between List and Set in Java

  • List 是有序集合,Set 是无序集合

列表是一个有序的集合,这意味着列表保留元素插入到列表的顺序。所以如果你在对象 B 之前插入对象A,那么A将被存储在比 B 更低的索引处。

由于 Set 是一个 UN-ordered 集合,它不保留任何元素的插入顺序,注意: SortedSet 接口提供了在 Set 接口的顶部排序功能,你可以在 Set 中存储对象的同时,通过使用 ComparatorComparable 来实现自然顺序或Object或任何自定义顺序。

  • List 允许在集合中存储重复项,而 Set 不允许任何重复项

List 和 Set 之间的另一个重要区别是,List 允许您在集合中存储重复项,而Set不允许任何重复项。在 Set 中使用 equals() 方法检测 Object 的重复。

因此,如果两个对象使用equals方法相等,则使用add()方法添加后面的对象将替换Set中的前者,由于这个原因,在Set内部只允许有一个null元素。

值得一提的是, TreeSet 类实现了 SortedSet 接口,其中采用 compareTo() 方法用来比较对象并决定对象是否重复。如果compareTo() 方法的返回值为0,那么两个对象将会重复,这就是为什么 compareTo 应该和 java 中的 equals() 方法一致。

conclusion

  • List maintains insertion order of elements while Set doesn't maintain any ordering.
  • The list allows duplicate objects while Set doesn't allow any duplicates.

此外在比较重ArrayList 和 HashSet 类的实现,可看出:ArrayList使用数组作为数据结构,而HashSet使用哈希机制。