Set和List有什么区别?

时间:2009-06-23 20:32:10

标签: java list set

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

27 个答案:

答案 0 :(得分:470)

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

List<E>:

  

有序集合(也称为   序列)。此界面的用户   精确控制在哪里   列表中插入了每个元素。该   用户可以通过他们访问元素   整数索引(列表中的位置),   并搜索列表中的元素。

Set<E>:

  

包含否的集合   重复元素。更正式的,   集合不包含元素对e1   和e2使得e1.equals(e2)和at   大多数一个null元素。正如所暗示的那样   它的名字,这个界面模型   数学集抽象。

答案 1 :(得分:204)

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

答案 2 :(得分:69)

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

访问

使用

实施
  • 链表
  • 的ArrayList

独特元素列表:
符合名为Set 的Java界面 可以通过索引

访问

使用

实施
  • HashSet(无序)
  • LinkedHashSet(已订购)
  • TreeSet(按自然顺序或提供的比较器排序)

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

答案 3 :(得分:26)

Set可以包含重复元素。 List(在Java中)也意味着顺序。

答案 4 :(得分:16)

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

从概念上讲,我们通常会引用一个无序分组,允许重复作为Bag,并且不允许重复是一个Set。

答案 5 :(得分:10)

<强>列表

  1. 是元素的有序分组。
  2. 列表用于收集带有重复项的元素。
  3. 在List中定义了新方法 接口
  4. 设置

    1. 是无序的元素分组。
    2. Set用于收集没有重复的元素。
    3. 在Set接口中没有定义新方法,因此我们必须仅将Collection接口方法用于Set子类。

答案 6 :(得分:9)

列表:

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

实施类包括:ArrayListLinkedListVector

设置:

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

实施类包括:  HashSet(无序),  LinkedHashSet(已订购),  TreeSet(按自然顺序或提供的比较器排序)

答案 7 :(得分:7)

当我们谈论Java接口时,为什么不看看Javadoc?!

  • List是有序集合(序列),通常允许 重复
  • Set a是不包含重复元素的集合,迭代 可以通过实施保证订单

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

答案 8 :(得分:5)

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

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

答案 9 :(得分:5)

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

  

有序集合(也称为   序列)。此界面的用户   精确控制在哪里   列表中插入了每个元素。该   用户可以通过他们访问元素   整数索引(列表中的位置),   并搜索列表中的元素。

     

与集合不同,列表通常允许   重复元素。更正式的,   列表通常允许成对   元素e1和e2这样   e1.equals(e2),它们通常是   允许多个null元素   允许null元素。它不是   不可想象有人可能希望   实施禁止的列表   重复,通过投掷运行时   用户尝试时的异常   插入它们,但我们希望这种用法   很少见。

答案 10 :(得分:3)

<强>列表:
List允许重复元素和空值。易于使用元素的相应索引进行搜索,并且还将按插入顺序显示元素。 例如:(链表)

import java.util.*;

public class 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个


价值:1个
价值:555
价值:333
价值:888
价值:555
值:空
值:空

设置
设置不允许任何重复元素,并且它允许单个空值。它不会维持任何显示元素的顺序。只有TreeSet将按升序显示。

例:(TreeSet中)

import java.util.TreeSet;

public class 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");
    }

 }

}

输出:

所有
你好
欢迎
世界
显示java.lang.NullPointerException
设置不允许空值和重复值

答案 11 :(得分:3)

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

2.List维护您将元素插入列表的顺序 设置没有维持秩序。 3.List是有序的元素序列,而Set是无序的元素列表。

答案 12 :(得分:2)

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

Set类不维护广告订单。它们可以选择强加特定的顺序(与SortedSet一样),但通常具有基于某些散列函数的实现定义顺序(与HashSet一样)。由于密钥访问Set,因此不允许重复。

答案 13 :(得分:2)

列出与设置

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

例如:LinkedHashSet。它维护插入顺序。请参阅click here

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

答案 14 :(得分:1)

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

1) Java中List和Set之间的基本区别是允许重复元素。 Java中的列表允许重复,而Set不允许任何重复。如果在Set中插入副本,它将替换旧值。任何Set in Java的实现都只包含唯一的元素。

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

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

很明显,如果您需要维护插入顺序或对象,并且您的集合可以包含重复项,那么List是一种方法。另一方面,如果您的要求是保持唯一的集合而没有任何重复,那么就是设置。

答案 15 :(得分:1)

列表:

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

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

答案 16 :(得分:1)

订购......列表有订单,订单则没有。

答案 17 :(得分:0)

列表:

  1. 列表是有序的分组元素
  2. 列表提供对集合元素的位置访问。
  3. 我们可以将重复的元素存储在int列表中。
  4. List实现ArrayList,LinkedList,Vector和Stack。
  5. 列表可以存储多个null元素。

设置:

  1. 无序分组元素。
  2. 集合不提供集合元素中的位置访问。
  3. 我们无法在集合中存储重复的元素。
  4. 设置实现HashSet和LinkedHashSet接口。
  5. 集合只能存储一个空元素。

答案 18 :(得分:0)

最大的不同是基本概念。

设置列表界面中。 设置是数学概念。 设置方法扩展了集合。但是,不添加新方法。 size()表示基数(更多为 BitSet.cardinality,线性计数器,日志记录,HyperLogLog )。 addAll()表示并集。 keepAll()表示交集。 removeAll()表示差异。

但是列表缺少这些概念。 列表添加了很多方法来支持 Collection 接口不提供的序列概念。核心概念是 INDEX 。例如add(index,element),get(index),search(indexOf()),remove(index)元素。列表还提供“ 集合视图子列表设置没有视图。没有位置访问权限。 列表还在 Collections 类中提供了很多算法。 sort(列表),binarySearch(列表),reverse(列表),shuffle(列表),fill(列表)。方法参数是 List 界面。重复元素只是概念的结果。不是本质的区别。

因此,本质区别在于概念。 集合是数学集合概念。列表是序列概念。

答案 19 :(得分:0)

嗨已经给出了很多答案。让我指出目前尚未提及的一些观点:

  • 大多数List实现(ArrayList,Vector)实现RandomAccess 接口,它是一个标记接口,可以更快地访问。没有任何Set实现那样做。
  • List使用一个名为ListIterator 的特殊迭代器,它支持双向迭代。 Set使用Iterator,它只支持1路迭代
  • HashSet比ArrayList存储 5.5倍的内存进行存储 相同数量的元素。

答案 20 :(得分:0)

列表设置都是界面。它们都扩展了Collection接口。 set和list之间的重要区别是:

  1. 重复对象

列表 设置 之间的主要区别在于,列表允许重复而Set不允许重复。

  1. 订购

列表是一个有序集合,它保持插入顺序,这意味着在显示列表内容时,它将以元素插入列表的顺序显示元素。

设置是一个无序集合,它不维护任何顺序。 Set 的实现很少维护其顺序,例如 LinkedHashSet (它按插入顺序维护元素)。

  1. 空元素

列表允许任意数量的 null元素集合最多只能有一个 null元素

答案 21 :(得分:0)

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

索引位置无法访问

Set元素,并且可以使用索引位置访问List个元素。

答案 22 :(得分:-1)

与SET没有重复值和List可以的答案一样。 当然,秩序是另一回事,让他们分开。

答案 23 :(得分:-1)

设置: 集合的集合中不能包含重复元素。它也是一个无序的集合。要从Set访问数据,需要仅使用Iterator,并且不能使用基于索引的检索。它主要用于需要唯一性收集时。

<强>列表: List可以有重复的元素,插入时自然排序。 因此,它可以基于索引或迭代器检索数据。它广泛用于存储需要基于索引访问的集合。

答案 24 :(得分:-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]

你可以看到区别在于:

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

答案 25 :(得分:-2)

主题名称:列表VS集

我刚刚完成了Java最重要的主题“Collections Framework”。我想与你分享我对收藏的一些知识。列表,设置,地图是它最重要的主题。所以让我们从List和Set开始。

List和Set之间的区别:

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

  2. 列表界面允许重复值(元素),而Set界面不允许重复值。如果Set中有重复元素,则会替换旧值。

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

  4. 列表界面维护广告订单。这意味着我们在List中添加元素的方式与使用迭代器或for-each样式获取元素的方式相同。而Set实现不一定保持插入顺序。 (虽然SortedSet使用TreeSetLinkedHashSet维护广告订单顺序。)

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

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

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

  8. 我们可以添加其他任何内容吗?请告诉我。

    感谢。

答案 26 :(得分:-3)

设置:

不能有重复的值 订购取决于实施。默认情况下,它不是订购的 无法按索引访问

<强>列表:

可以有重复的值 默认排序 可以按索引访问