Set<E>
和 List<E>
接口之间的根本区别是什么?排序...列表有顺序,集合没有。
列表:
集合:
嗨,已经有很多答案了...让我指出一些迄今未提到的要点:
RandomAccess
接口,这是一种用于更快访问的标记接口。没有任何Set实现这样做。ListIterator
支持双向迭代。Set使用的迭代器只支持单向迭代。这里有一个使用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]
可以看出,它们的区别在于:
主题名称:List VS Set
我刚刚学习了Java最重要的主题——集合框架。我想和你分享一下我对集合的一点了解。List、Set、Map是其中最重要的主题。所以让我们从List和Set开始。
List和Set的区别:
List是一个集合类,它扩展了AbstractList
类,而Set是一个集合类,它扩展了AbstractSet
类,但两者都实现了Collection接口。
List接口允许重复的值(元素),而Set接口不允许重复的值。在Set中出现重复元素时,它会替换旧值。
List接口允许NULL值,而Set接口不允许Null值。在Set中使用Null值时,它会抛出NullPointerException
异常。
List接口维护插入顺序。这意味着我们添加元素到List中的方式与使用迭代器或for-each样式获取它的方式相同。而Set
实现不一定维护插入顺序。(尽管SortedSet
使用TreeSet
维护排序,LinkedHashSet
维护插入顺序)。
List接口有自己定义的方法,而Set接口没有自己的方法,因此Set只使用Collection接口的方法。
List接口有一个遗留类叫做Vector
,而Set接口没有任何遗留类。
最后但并非最不重要的是...listIterator()
方法只能用于循环遍历List类中的元素,而我们可以使用iterator()方法访问Set类元素。
还有其他需要添加的吗?请告诉我。
谢谢。
List
和Set
都是接口,它们还有抽象类形式的“基础”实现(正如您所提到的)。其次,第三点是完全不准确的,因为大多数集合允许空值(但具体取决于实现)。我不理解第五点和第七点,至于第六点,Vector
并不是已经过时的,只是在需要同步的情况下才使用,而不是首选。 - glen3b集合:
不允许有重复的值 排序取决于实现方式。默认情况下不排序 不能通过索引进行访问
列表:
可以有重复的值 默认按顺序排列 可以通过索引进行访问