Set<E>
和List<E>
接口之间的根本区别是什么?
26 回答
List
是一个有序的元素序列,而Set
是一个不同的无序元素列表(谢谢,Quinn Taylor)。
有序集合(也称为序列)。此界面的用户可以精确控制每个元素在列表中的插入位置。用户可以通过整数索引(列表中的位置)访问元素,并在列表中搜索元素。
不包含重复元素的集合。更正式地说,集合不包含一对元素 e1 和 e2 使得 e1.equals(e2),并且最多包含一个空元素。正如它的名字所暗示的,这个接口模拟了数学集合抽象。
列表 | 放 | |
---|---|---|
重复 | 是的 | 不 |
命令 | 已订购 | 取决于实施 |
职位访问 | 是的 | 不 |
元素的有序列表(唯一与否)
符合 Java 的名为List
Can be access by index
使用实现
- 链表
- 数组列表
唯一元素列表:
符合 Java 的名为Set
Can not be access by index的接口
使用实现
- HashSet(无序)
- LinkedHashSet(有序)
- TreeSet(按自然顺序或提供的比较器排序)
既是接口Set
又List
符合 Java 的接口命名Collection
Set 不能包含重复元素,而 List 可以。列表(在 Java 中)也意味着顺序。
- 列表是项目的有序分组
- 集合是不允许重复的项目的无序分组(通常)
从概念上讲,我们通常将允许重复的无序分组称为 Bag,不允许重复的分组称为 Set。
列表:
List
s 一般允许重复对象。
List
s 必须是有序的,因此可以通过索引访问。
实现类包括:ArrayList
, LinkedList
,Vector
放:
Set
s不允许重复的对象。大多数实现是无序的,但它是特定于实现的。
实现类包括:(
HashSet
无序)、
LinkedHashSet
(有序)、
TreeSet
(按自然顺序或提供的比较器排序)
列表
- 是元素的有序分组。
- List 用于收集具有重复项的元素。
- 新方法在 List 接口中定义。
放
- 是元素的无序分组。
- Set 用于收集没有重复的元素。
- Set 接口内部没有定义新的方法,因此我们只能在 Set 子类中使用 Collection 接口方法。
List:
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
null
null
值:1
值:555
值:333
值:888
值:555
值:null
值:null
集合:
集合不允许任何重复元素,它允许单个空值。它不会保持任何显示元素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
设置不允许空值和重复值
当我们谈论 Java 接口时,为什么不看看 Javadoc 呢?!
- A
List
是有序集合(序列),通常允许重复 - 一个
Set
a 是不包含重复元素的集合,迭代顺序可以由实现来保证
没有提到关于集合缺乏顺序:这取决于实现。
集合是一组无序的不同对象——不允许有重复的对象。它通常使用被插入对象的哈希码来实现。(具体实现可能会添加排序,但 Set 接口本身不会。)
列表是一组有序的对象,其中可能包含重复项。它可以用 , 等来ArrayList
实现LinkedList
。
这可能不是您要寻找的答案,但集合类的 JavaDoc 实际上非常具有描述性。复制/粘贴:
有序集合(也称为序列)。此界面的用户可以精确控制每个元素在列表中的插入位置。用户可以通过整数索引(列表中的位置)访问元素,并在列表中搜索元素。
与集合不同,列表通常允许重复元素。更正式地说,列表通常允许元素 e1 和 e2 对,例如 e1.equals(e2),并且如果它们完全允许 null 元素,它们通常允许多个 null 元素。有人可能希望通过在用户尝试插入它们时抛出运行时异常来实现一个禁止重复的列表,这并非不可想象,但我们希望这种用法很少见。
因素 | 列表 | 放 |
---|---|---|
是有序分组元素吗? | 是的 | 不 |
按索引提供位置访问? | 是的 | 不 |
可以存储重复元素吗? | 是的 | 不 |
可以存储多个null 元素吗? |
是的 | 不 |
孩子们: | ArrayList , LinkedList ,Vector 和Stack |
HashSet 和LinkedHashSet |
1.List允许重复值,set不允许重复
2.List 维护您在列表中插入元素的顺序 Set 不维护顺序。3.List是一个有序的元素序列,而Set是一个不同的无序元素列表。
Java中List和Set之间的一些值得注意的区别如下:
1) Java 中 List 和 Set 的根本区别是允许重复元素。Java 中的 List 允许重复,而 Set 不允许任何重复。如果您在 Set 中插入重复项,它将替换旧值。Java 中 Set 的任何实现都只会包含唯一的元素。
2) Java 中 List 和 Set 的另一个显着区别是顺序。List 是有序集合,而 Set 是无序集合。List 维护元素的插入顺序,这意味着之前插入的任何元素都将比之后插入的任何元素的索引低。Java 中的 Set 不维护任何顺序。尽管 Set 提供了另一种称为 SortedSet 的替代方法,它可以按照存储在 Set 中的对象的 Comparable 和 Comparator 方法定义的特定排序顺序存储 Set 元素。
3) Java中List接口的流行实现包括ArrayList、Vector和LinkedList。Set 接口的流行实现包括 HashSet、TreeSet 和 LinkedHashSet。
很明显,如果您需要维护插入顺序或对象,并且您的集合可以包含重复项,那么 List 是一种可行的方法。另一方面,如果您的要求是维护没有任何重复的唯一集合,那么 Set 是可行的方法。
列表与集合
1) Set 不允许重复。列表允许重复。基于 Set 的实现,它还维护了插入 Order 。
例如:LinkedHashSet
。它维护插入顺序。请参阅单击此处
2)包含方法。根据 Set 的性质,它将提供更好的访问性能。最好的情况是 o(1)。但是 List 有性能问题要调用contains
。
List和Set都是接口。它们都扩展了 Collection 接口。集合和列表之间的重要区别是:
- 重复对象
List和Set的主要区别在于List允许重复,而 Set 不允许重复。
- 命令
List是一个有序集合,它维护插入顺序,这意味着在显示列表内容时,它将以元素插入列表的相同顺序显示元素。
Set是一个无序的集合,它不维护任何顺序。很少有Set的实现保持顺序,例如LinkedHashSet(它保持插入顺序中的元素)。
- 空元素
List允许任意数量的空元素。Set最多只能有一个空元素。
所有List
类都保持插入顺序。它们根据性能和其他特性使用不同的实现(例如ArrayList
,为了访问特定索引的速度,LinkedList
为了简单地维护顺序)。由于没有密钥,因此允许重复。
这些Set
类不维护插入顺序。它们可以选择性地强加一个特定的顺序(如SortedSet
),但通常具有基于某些散列函数的实现定义的顺序(如HashSet
)。由于Set
s 是通过键访问的,因此不允许重复。
最大的不同是基本概念。
从设置和列表界面。集是数学概念。设置方法扩展集合。但不添加新方法。size() 表示基数(更多的是BitSet.cardinality,Linear counter,Log Log,HyperLogLog)。addAll() 表示联合。retainAll() 表示交集。removeAll() 表示差异。
然而List缺少这些概念。List添加了很多方法来支持Collection接口不提供的序列概念。核心概念是INDEX。比如 add(index,element),get(index),search(indexOf()),remove(index) 元素。List 还提供“ Collection View ”子列表。设置没有视图。没有位置访问权限。List在Collections类中也提供了很多算法。排序(列表),二进制搜索(列表),反向(列表),洗牌(列表),填充(列表)。方法params是List接口。重复的元素只是概念的结果。不是本质的区别。
所以本质上的区别是概念。集合是数学集合概念。列表是序列概念。
排序......一个列表有一个顺序,一个集合没有。
列表:
- 允许重复。
- 在分组元素中排序。(换句话说,具有确定的顺序。不需要按升序排序)
放:
- 不允许重复。
- 在分组元素中无序。(换句话说,没有明确的顺序。它可能按升序排列,也可能不按升序排列)
Set<E>
并且List<E>
都用于存储类型的元素E
。不同之处在于Set
它以无序方式存储并且不允许重复值。List
用于以有序的方式存储元素,它确实允许重复值。
Set
元素不能通过索引位置访问,而List
元素可以通过索引位置访问。
Set: Set 的集合中不能有 Duplicate 元素。它也是一个无序集合。要从 Set 中访问数据,只需要使用 Iterator,并且不能使用基于索引的检索。它主要用于需要唯一性集合的时候。
列表: 列表可以有重复的元素,插入时具有自然顺序。因此,可以根据索引或迭代器检索数据。它广泛用于存储需要基于索引访问的集合。
嗨 已经给出了很多答案..让我指出一些到目前为止没有提到的点:
- 大多数 List 实现(ArrayList、Vector)都实现
RandomAccess
了接口,这是一个用于更快访问的标记接口。Set 实现都没有这样做。 - List 使用一种特殊的 Iterator 称为
ListIterator
支持双向迭代。Set 使用仅支持 1 路迭代的迭代器 - HashSet 在存储相同数量的元素时占用的内存是 ArrayList 的 5.5 倍。
这是一个带有 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]
您可以看到不同之处在于:
- Set 不允许重复值。
- 列表允许重复值。
主题名称:列表 VS 集合
我刚刚浏览了 Java 最重要的主题,称为集合框架。我想和你分享我对收藏的小知识。List、Set、Map是其中最重要的话题。因此,让我们从 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 Classes 中的元素,而我们可以使用 iterator() 方法访问 Set 类元素
我们还能补充什么吗?请告诉我。
谢谢。
放:
不能有重复值 排序取决于实现。默认情况下它是无序的 不能通过索引访问
列表:
可以有重复值 默认排序 可以按索引访问