Set和List有何不同?

511
Set<E>List<E> 接口之间的根本区别是什么?

1
请参见https://dev59.com/H3RA5IYBdhLWcg3w9ivq。 - Michael Myers
5
如果您想了解性能方面的信息,请查看此问题:https://dev59.com/K2gv5IYBdhLWcg3wKtvj - vsingh
26个回答

1

排序...列表有顺序,集合没有。


2
集合 ADT 不指定排序,但某些集合实现(如 LinkedHashSet)保持插入顺序。 - Michael Myers
3
然而,更为重要的区别是集合不允许有重复项,而袋子/多重集合则允许。 - Quinn Taylor
TreeSet有排序。 - stackoverflowuser2010

1

列表:

  1. 允许重复。
  2. 按组元素排序。(换句话说,有明确的顺序。不需要按升序排序)

集合:

  1. 不允许重复。
  2. 按组元素无序。(换句话说,没有明确的顺序。可能或可能不按升序排列)

0

嗨,已经有很多答案了...让我指出一些迄今未提到的要点:

  • 大多数列表实现(ArrayList、Vector)实现了RandomAccess接口,这是一种用于更快访问的标记接口。没有任何Set实现这样做。
  • List使用一种特殊的迭代器称为ListIterator支持双向迭代。Set使用的迭代器只支持单向迭代。
  • HashSet存储相同数量的元素时,需要比ArrayList多5.5倍的内存

@smurti 这有点晚了,我不确定你是否注意到了,但是你的第一个观点自相矛盾:“大多数List实现(ArrayList、Vector)实现了RandomAccess...”和“...没有任何List实现这样做”。 - Peter

-1

这里有一个使用Groovy的清晰示例。我创建了一个集合和一个列表。 然后我尝试在每个列表中存储20个随机生成的值。生成的值可以在0到5的范围内。

s = [] as Set
l = []

max = 5
print "random Numbers :"
20.times{
e = (int)Math.random()*max
s << e
l << e
print "$e, "
}


println "\n"
println "Set : $s "
println "list : $l

结果:

随机数:4, 1, 4, 0, 1, 2, 4, 0, 0, 3, 4, 3, 2, 0, 4, 0, 1, 3, 1, 3

集合:[4, 1, 0, 2, 3]

列表:[4, 1, 4, 0, 1, 2, 4, 0, 0, 3, 4, 3, 2, 0, 4, 0, 1, 3, 1, 3]

可以看出,它们的区别在于:

  • 集合不允许重复值。
  • 列表允许重复值。

1
列表也保持顺序。 - glen3b

-1

主题名称:List VS Set

我刚刚学习了Java最重要的主题——集合框架。我想和你分享一下我对集合的一点了解。List、Set、Map是其中最重要的主题。所以让我们从List和Set开始。

List和Set的区别:

  1. List是一个集合类,它扩展了AbstractList类,而Set是一个集合类,它扩展了AbstractSet类,但两者都实现了Collection接口。

  2. List接口允许重复的值(元素),而Set接口不允许重复的值。在Set中出现重复元素时,它会替换旧值。

  3. List接口允许NULL值,而Set接口不允许Null值。在Set中使用Null值时,它会抛出NullPointerException异常。

  4. List接口维护插入顺序。这意味着我们添加元素到List中的方式与使用迭代器或for-each样式获取它的方式相同。而Set实现不一定维护插入顺序。(尽管SortedSet使用TreeSet维护排序,LinkedHashSet维护插入顺序)。

  5. List接口有自己定义的方法,而Set接口没有自己的方法,因此Set只使用Collection接口的方法。

  6. List接口有一个遗留类叫做Vector,而Set接口没有任何遗留类。

  7. 最后但并非最不重要的是...listIterator()方法只能用于循环遍历List类中的元素,而我们可以使用iterator()方法访问Set类元素。

还有其他需要添加的吗?请告诉我。

谢谢。


首先,ListSet都是接口,它们还有抽象类形式的“基础”实现(正如您所提到的)。其次,第三点是完全不准确的,因为大多数集合允许空值(但具体取决于实现)。我不理解第五点和第七点,至于第六点,Vector并不是已经过时的,只是在需要同步的情况下才使用,而不是首选。 - glen3b

-3

集合:

不允许有重复的值 排序取决于实现方式。默认情况下不排序 不能通过索引进行访问

列表:

可以有重复的值 默认按顺序排列 可以通过索引进行访问


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接