Set和List有什么区别?

Set<E>List<E>接口的基本区别是什么?

List是一个有序的元素序列,而Set是一个独特的无序列表(谢谢Quinn Taylor )。

List<E>:

有序集合(也称为序列)。 这个接口的用户可以精确地控制每个元素插入到列表中的哪个位置。 用户可以通过整数索引(列表中的位置)来访问元素,并search列表中的元素。

Set<E>:

不包含重复元素的集合。 更正式地,集合不包含e1和e2这样的元素,使得e1.equals(e2)和至多一个空元素。 正如其名称所暗示的,这个接口模拟了math集抽象。

 ╔═══════════════════╦══════════════════════╦═════════════════════════════╗ ║ ║ List ║ Set ║ ╠═══════════════════╬══════════════════════╬═════════════════════════════╣ ║ Duplicates ║ YES ║ NO ║ ╠═══════════════════╬══════════════════════╬═════════════════════════════╣ ║ Order ║ ORDERED ║ DEPENDS ON IMPLEMENTATION ║ ╠═══════════════════╬══════════════════════╬═════════════════════════════╣ ║ Positional Access ║ YES ║ NO ║ ╚═══════════════════╩══════════════════════╩═════════════════════════════╝ 

元素的有序列表(唯一或不)
符合名为List Java接口
可以通过索引访问

实施使用

  • 链表
  • 数组列表

独特元素清单:
符合名为Set Java接口
不能被索引访问

实施使用

  • HashSet(无序)
  • LinkedHashSet(有序)
  • TreeSet(按自然顺序或通过提供的比较器sorting)

SetList接口都符合Java的接口,名为Collection

List可以包含重复元素。 列表(Java)也意味着秩序。

  • 列表是有序的项目分组
  • 一个Set是一个无序的项目分组,不允许重复(通常)

从概念上讲,我们通常是指无序的分组,允许重复作为一个袋子,不允许重复是一个集合。

名单

  1. 是一个有序的元素分组。
  2. 列表用于收集重复的元素。
  3. List接口中定义了新的方法。

  1. 是一个无序的元素分组。
  2. Set用于收集没有重复的元素。
  3. 在Set接口中没有定义新的方法,所以我们只能使用Collection接口方法和Set子类。

列表:

List通常允许重复的对象。 List必须是有序的,因此可以通过索引访问。

实现类包括: ArrayListLinkedListVector

组:

Set s不允许重复的对象。 大多数实现是无序的,但是它是特定于实现的。

实现类包括: HashSet (无序), LinkedHashSet (有序), TreeSet (按自然顺序sorting或由提供的比较器sorting)

正如我们正在谈论的Java接口,为什么不看看Javadoc?

  • List是一个有序的集合(序列),通常允许重复
  • Set a是一个不包含重复元素的集合,迭代顺序可以由实现保证

没有提到关于集合的缺乏顺序:这取决于实现。

这可能不是你正在寻找的答案,但是集合类的JavaDoc实际上是非常具有描述性的。 复制/粘贴:

有序集合(也称为序列)。 这个接口的用户可以精确地控制每个元素插入到列表中的哪个位置。 用户可以通过整数索引(列表中的位置)来访问元素,并search列表中的元素。

与集合不同,列表通常允许重复的元素。 更正式地说,列表通常允许元素e1和e2的对,使得e1.equals(e2),并且它们通常允许多个null元素,如果它们完全允许空元素的话。 有人可能希望通过在用户尝试插入时抛出运行时exception来实现禁止重复的列表,这并不是不可想象的,但是我们预计这种用法很less见。

一组是一组不同的对象的无序组合 – 不允许重复的对象。 它通常使用被插入的对象的哈希码来实现。 (具体实现可能会添加sorting,但Set接口本身不会。)

列表是可能包含重复项的有序对象组。 它可以用ArrayListLinkedList等来实现

1.List允许重复值和设置不允许重复

2.List维护您将元素插入到列表中的顺序Set不保持顺序。 3.List是一个有序的元素序列,而Set是一个无序的元素清单。

订购…一个清单有一个订单,一个集合没有。

所有的List类都保持插入的顺序。 他们使用基于性能和其他特性的不同实现(例如, ArrayList用于访问特定索引的速度, LinkedList用于简单维护顺序)。 由于没有密钥,所以允许重复。

Set类不维护广告订单。 他们可以select强加一个特定的顺序(与SortedSet ),但通常具有基于某个哈希函数的实现定义的顺序(与HashSet )。 由于Set是通过键来访问的,所以不允许重复。

列表Vs设置

1)设置不允许重复。 列表允许重复。 基于Set的实现,它也维护插入顺序。

例如: LinkedHashSet 。 它维护插入顺序。请参考点击这里

2) 包含方法。 根据Set的性质,它将会提供更好的访问性能。 最好的例子是o(1)。 但List有调用contains性能问题。

Java和List之间值得注意的差异如下:

1) List和Set在Java中的基本区别是允许重复的元素。 Java中的列表允许重复,而Set不允许任何重复。 如果您在设置中插入重复项,则会replace旧值。 Java中Set的任何实现都只包含唯一的元素。

2) List和Set之间的另一个显着的差异是Java。 列表是有序集合,而集合是无序集合。 列表维护元素的插入顺序,意味着之前插入的任何元素都会比之后插入的任何元素下一个索引。 在Java中设置不保持任何顺序。 尽pipeSet提供了另一个称为SortedSet的替代方法,它可以按照存储在Set中的Object的Comparable和Comparator方法定义的特定sorting顺序来存储Set元素。

3) Java中List接口的stream行实现包括ArrayList,Vector和LinkedList。 Set接口的stream行实现包括HashSet,TreeSet和LinkedHashSet。

它非常清楚,如果你需要维护插入顺序或对象,你收集可以包含重复比List是一种方式去。 另一方面,如果你的要求是保持独特的收集没有任何重复比Set是要走的路。

Set<E>List<E>都用于存储Etypes的元素。 不同之处在于, Set以无序的方式存储,并且不允许重复的值。 List用于以有序方式存储元素,并且允许重复值。

Set元素不能通过索引位置访问,而List元素可以通过索引位置访问。

列表:

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

组:

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

表里不一

设置不允许重复。 Set和所有实现Set接口的类应该有唯一的元素。 列表允许重复的元素。 可以将任意数量的重复元素插入到列表中,而不会影响相同的现有值及其索引。

空值

 List allows any number of null values. Set allows single null value at most 

订购

列表及其所有实现类都维护插入顺序。 Set不保留任何顺序,它的类中仍然有很less的顺序排列元素,如LinkedHashSet维护插入顺序和TreeSet中的元素(默认情况下元素保持升序)

类实现

 List: ArrayList, LinkedList Set: HashSet, LinkedHashSet, TreeSet 

列表:列表允许重复元素和空值。对于使用元素的相应索引的search元素来说,易于使用,并且它将以插入顺序显示元素。 例如:(linkedlist)import java.util。*;

公共类ListExample {

 public static void main(String[] args) { // TODO Auto-generated method stub List<Integer> l=new LinkedList<Integer>(); l.add(001); l.add(555); l.add(333); l.add(888); l.add(555); l.add(null); l.add(null); Iterator<Integer> il=l.iterator(); System.out.println(l.get(0)); while(il.hasNext()){ System.out.println(il.next()); } for(Integer str : l){ System.out.println("Value:"+str); } } 

}

输出:

1 1 555 333 888 555 null null值:1值:555值:333值:888值:555值:null值:null

Set:Set不允许任何重复的元素,它允许单个null值。它不会维护任何显示元素的顺序。只有TreeSet会按升序显示。

例如:(TreeSet中)

import java.util.TreeSet;

公共类SetExample {

 public static void main(String[] args) { // TODO Auto-generated method stub TreeSet<String> set = new TreeSet<String>(); try { set.add("hello"); set.add("world"); set.add("welcome"); set.add("all"); for (String num : set) { System.out.println( num); } set.add(null); } catch (NullPointerException e) { System.out.println(e); System.out.println("Set doesn't allow null value and duplicate value"); } } 

}

输出:

all hello welcome world java.lang.NullPointerException设置不允许空值和重复值

基于以下几点的差异

1)重复:列表允许重复的元素。 可以将任意数量的重复元素插入到列表中,而不会影响相同的现有值及其索引。 设置不允许重复。 Set和所有实现Set接口的类应该有唯一的元素。

2)空值:列表允许任意数量的空值。 设置最多允许单个空值。

3)顺序:列表及其所有的实现类维护插入顺序。 Set不保持任何顺序; 仍然有很less的类按照顺序排列元素,例如LinkedHashSet以插入顺序维护元素。

嗨这么多的答案已经给予..让我指出一些目前没有提到的要点:

  • 大部分的List实现(ArrayList,Vector) 实现了RandomAccess接口,这是一个标记接口,可以更快的访问。 没有一个List实现这样做。
  • List使用一个名为ListIterator特殊Iterator ,它支持双向迭代 。 Set使用仅支持1路迭代的Iterator
  • HashSet比ArrayList 占用5.5倍的内存来存储相同数量的元素。

这里是一个明确的例子与groovy。 我创build一个集合和一个列表。 然后我尝试在每个列表中存储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]

你可以看到不同之处在于:

  • 设置不允许重复的值。
  • 列表允许重复的值。

像SET一样没有重复值和List可以。 当然,顺序是另一个不同的东西。

设置:一个集合的集合中不能有重复元素。 它也是一个无序的集合。 要从Set中访问数据,只需要使用迭代器,而不能使用基于索引的检索。 它主要用于任何需要的唯一性收集。

列表:列表可以包含重复的元素,插入时自然sorting。 因此,它可以基于索引或迭代器检索数据。 它被广泛用于存储需要基于索引访问的集合。

主题名称:列表VS设置

我刚刚浏览了Java最重要的一个名为Collections Framework的主题。 我想和你分享一下关于collections的知识。 列表,设置,地图是最重要的话题。 那么让我们从List和Set开始吧。

列表和集之间的区别:

  1. List是一个集合类,它扩展了AbstractList类,其中Set是扩展了AbstractSet类但是实现了Collection接口的集合类。

  2. List接口允许重复的值(元素),而Set接口不允许重复的值。 如果Set中的元素重复,则会replace较旧的值。

  3. List接口允许NULL值,其中Set接口不允许Null值。 如果在Set中使用Null值,则会给出NullPointerException

  4. 列表界面维护插入顺序。 这意味着我们按照我们使用迭代器或for-each样式获取元素的方式添加List中的元素。 而Set实现不一定保持插入顺序。 (虽然SortedSet使用TreeSet ,并且LinkedHashSet维护插入顺序)。

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

  6. List接口有一个名为Vector遗留类,而Set接口没有任何遗留类

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

还有什么可以补充的? 请告诉我。

谢谢。

组:

不能有重复的值sorting依赖于实现。 默认情况下它没有被sorting不能被索引访问

列表:

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