作者:巧克力er
坐标:江苏 南京
我们经常听说List是有序且重复的, Set 是无序不重复的。这里有个误区,这里说的顺序有两个概念,一是按添加的顺序排列,二是按自然顺序 a-z 排列。 Set 并不是无序的,传统说的
Set 无序是指 HashSet, 它不能保证元素的添加顺序,更不能保证自然顺序,而 Set 的其他实现类是可以实现这两种顺序的。
先来看看一段测试代码:
public class CollectionTest {
public static void main(String[] args) {
List<String> arrayList = new ArrayList<String>();
arrayList.add("s1");
arrayList.add("s3");
arrayList.add("s4");
arrayList.add("s5");
arrayList.add("s2");
System.out.println("ArrayList:==========================");
for(String arrList : arrayList){
System.out.println(arrList);
}
List<String> linkedList = new LinkedList<String>();
linkedList.add("s1");
linkedList.add("s3");
linkedList.add("s4");
linkedList.add("s5");
linkedList.add("s2");
System.out.println("LinkedList:===========================");
for(String linkList : linkedList){
System.out.println(linkList);
}
Set<String> hashSet = new HashSet<String>();
hashSet.add("s1");
hashSet.add("s3");
hashSet.add("s4");
hashSet.add("s5");
hashSet.add("s2");
System.out.println("HashSet:==============================");
for(String hashst: hashSet){
System.out.println(hashst);
}
Set<String> linkedHashSet = new LinkedHashSet<String>();
linkedHashSet.add("s1");
linkedHashSet.add("s3");
linkedHashSet.add("s4");
linkedHashSet.add("s5");
linkedHashSet.add("s2");
System.out.println("LinkedHashSet:=========================");
for(String linkedst : linkedHashSet){
System.out.println(linkedst);
}
Set<String> treeSet = new TreeSet<String>();
treeSet.add("s1");
treeSet.add("s3");
treeSet.add("s4");
treeSet.add("s5");
treeSet.add("s2");
System.out.println("TreeSet:==============================");
for(String treest : treeSet){
System.out.println(treest);
}
}
下面输出的结果:
ArrayList:==========================
s1
s3
s4
s5
s2
LinkedList:===========================
s1
s3
s4
s5
s2
HashSet:==============================
s3
s4
s5
s1
s2
LinkedHashSet:=========================
s1
s3
s4
s5
s2
TreeSet:==============================
s1
s2
s3
s4
s5
怎么样看出来了吧,我们通常说的 List 是you序的指的就是最后集合中的元素顺序就是按照添加时候的顺序排列的(无论是实现类 ArrayList, 还是 LinkedList)。但是我们发现 Set 所谓的无序就是在 HashSet 这个实现类中才会出现的这种情况,而 LinkedHashSet 已经和 List 的结果相同了,再看 TreeSet 实现的功能是根据元素的自然顺序排列了。
小伙伴们明白了吗? 以后不要再说 Set 无序了啊! O_O