Set<E>
和List<E>
接口之间的根本区别是什么?
答案 0 :(得分:470)
List
是一个有序的元素序列,而Set
是一个不同的元素列表(谢谢,Quinn Taylor)。
有序集合(也称为 序列)。此界面的用户 精确控制在哪里 列表中插入了每个元素。该 用户可以通过他们访问元素 整数索引(列表中的位置), 并搜索列表中的元素。
包含否的集合 重复元素。更正式的, 集合不包含元素对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界面
可以通过索引
使用
实施独特元素列表:
符合名为Set
的Java界面
可以通过索引
使用
实施接口Set
和List
都符合Java的名为Collection
的接口
答案 3 :(得分:26)
Set可以包含重复元素。 List(在Java中)也意味着顺序。
答案 4 :(得分:16)
从概念上讲,我们通常会引用一个无序分组,允许重复作为Bag,并且不允许重复是一个Set。
答案 5 :(得分:10)
<强>列表强>
设置强>
答案 6 :(得分:9)
List
通常允许重复的对象。
必须对List
进行排序,因此可以通过索引访问。
实施类包括:ArrayList
,LinkedList
,Vector
Set
s 不允许重复的对象。
大多数实现都是无序的,但它是特定于实现的。
实施类包括:
HashSet
(无序),
LinkedHashSet
(已订购),
TreeSet
(按自然顺序或提供的比较器排序)
答案 7 :(得分:7)
当我们谈论Java接口时,为什么不看看Javadoc?!
List
是有序集合(序列),通常允许
重复Set
a是不包含重复元素的集合,迭代
可以通过实施保证订单没有提及关于集合的缺乏顺序:它取决于实现。
答案 8 :(得分:5)
集合是一组无序的不同对象 - 不允许重复的对象。它通常使用要插入的对象的哈希码来实现。 (具体实现可能会添加排序,但Set接口本身不会。)
列表是一组有序的对象,可能包含重复项。它可以使用ArrayList
,LinkedList
等实现
答案 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)
列表:
集:
答案 16 :(得分:1)
订购......列表有订单,订单则没有。
答案 17 :(得分:0)
列表:
设置:
答案 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)
嗨已经给出了很多答案。让我指出目前尚未提及的一些观点:
RandomAccess
接口,它是一个标记接口,可以更快地访问。没有任何Set实现那样做。ListIterator
的特殊迭代器,它支持双向迭代。 Set使用Iterator,它只支持1路迭代答案 20 :(得分:0)
列表和设置都是界面。它们都扩展了Collection接口。 set和list之间的重要区别是:
列表 和 设置 之间的主要区别在于,列表允许重复而Set不允许重复。
列表是一个有序集合,它保持插入顺序,这意味着在显示列表内容时,它将以元素插入列表的顺序显示元素。
设置是一个无序集合,它不维护任何顺序。 Set 的实现很少维护其顺序,例如 LinkedHashSet (它按插入顺序维护元素)。
列表允许任意数量的 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之间的区别:
List是一个扩展AbstractList
类的集合类,其中Set是一个扩展AbstractSet
类但都实现Collection接口的集合类。
列表界面允许重复值(元素),而Set界面不允许重复值。如果Set中有重复元素,则会替换旧值。
List接口允许NULL值,而Set接口不允许Null值。如果在Set中使用Null值,则给出NullPointerException
。
列表界面维护广告订单。这意味着我们在List中添加元素的方式与使用迭代器或for-each样式获取元素的方式相同。而Set
实现不一定保持插入顺序。 (虽然SortedSet
使用TreeSet
,LinkedHashSet
维护广告订单顺序。)
List接口有自己定义的方法,而Set接口没有自己的方法,所以Set只使用Collection接口方法。
List接口有一个名为Vector
的遗留类,而Set接口没有任何遗留类
最后但并非最不重要...... listIterator()
方法只能用于遍历List Classes中的元素,而我们可以使用iterator()方法来访问Set类元素
我们可以添加其他任何内容吗?请告诉我。
感谢。
答案 26 :(得分:-3)
设置:强>
不能有重复的值 订购取决于实施。默认情况下,它不是订购的 无法按索引访问
<强>列表:强>
可以有重复的值 默认排序 可以按索引访问