Set<E>
和 List<E>
接口之间的根本区别是什么?List
是一个有序元素的序列,而Set
是一个无序的不重复元素列表(感谢Quinn Taylor)。
有序集合,用户可以精确控制每个元素在列表中的插入位置。用户可以通过它们在列表中的整数索引(位置)访问元素,并搜索列表中的元素。
不包含重复元素的集合。更正式地说,集合不包含任何一对元素e1和e2使得e1.equals(e2),并且最多只有一个空元素。顾名思义,该接口模拟了数学集合抽象。
列表 | 集合 | |
---|---|---|
重复元素 | 是 | 否 |
顺序 | 有序 | 取决于实现方式 |
位置访问 | 是 | 否 |
元素的有序列表(唯一或非唯一)
符合Java命名为List
的接口
可以通过索引进行访问
使用以下方式实现
唯一元素的列表:
符合Java命名为Set
的接口
无法通过索引进行访问
使用以下方式实现
这两个接口Set
和List
都符合Java命名为Collection
的接口
一个Set不能包含重复元素,而List可以。在Java中,List还意味着有序。
在概念上,我们通常将允许重复的无序分组称为Bag,不允许重复的则称为Set。
列表
一般允许重复的对象。
列表
必须按顺序排列,因此可以通过索引进行访问。
实现类包括:ArrayList
、LinkedList
、Vector
集合
不允许有重复的对象。
大多数实现是无序的,但具体取决于实现。
实现类包括:
HashSet
(无序),
LinkedHashSet
(按添加顺序排序),
TreeSet
(按自然顺序或提供的比较器排序)
列表
集合
列表:
列表允许重复元素和空值。可以使用元素的相应索引轻松搜索,并按照插入顺序显示元素。
示例:(链表)
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
会按升序显示。
示例:(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");
}
}
}
输出:
all
hello
welcome
world
java.lang.NullPointerException
集合不允许空值和重复值
List和Set都是接口,它们都继承自Collection接口。Set和List之间的重要区别有:
List和Set之间的主要区别是,List允许有重复元素,而Set不允许有重复元素。
List是一个有序的集合,它保持插入顺序,这意味着在显示列表内容时,它将按照元素插入列表的顺序显示元素。
Set是一个无序的集合,它不保持任何顺序。有一些Set实现可以保持顺序,例如LinkedHashSet(它按照插入顺序维护元素)。
List允许任意数量的空元素。 Set最多只能有一个空元素。
既然我们正在谈论Java接口,为什么不看一下Javadoc呢?!
List
是一个有序的集合(序列),通常允许重复元素Set
是一个不包含重复元素的集合,迭代顺序可以由实现保证关于集合是否有序,Sets没有提到缺乏任何信息:这取决于具体实现。
LinkedHashSet
放在左侧。如果我真的像使用Set
一样使用它,那么我只会使用Set
,因为你不能假设底层实现是LinkedHashSet
或类似的,今天可能是这样,但明天代码改变了就会失败。 - Christophe Roussy