首先,我们要明确的一点是,在java中我们通常说的集合有序无序针对的是插入顺序,是指在插入元素时,插入的顺序是否保持,当遍历集合时它是否会按照插入顺序展示。像TreeSet和TreeMap这样的集合主要实现了自动排序,我们称之为排序,而根据前面的定义它不一定是有序的。
所以,在我们常见的集合类型中,有序的有ArrayList,LinkedList,LinkedHashSet,LinkedHashMap等,无序的有HashSet,HashMap,HashTable,TreeSet,TreeMap等,而同时TressSet和TressMap又是可排序的。
1. List 一定有序
list是有序的,是以数组的存储方式进行存储.也就是说数组什么样它就什么样,唯一的区别就是,它没有固定大小。 且list的检索效率比较高,不过要频繁的对这个容器里的元素进行更新就不要用它了,用linkedlist比较好.
顺序放进去是不会乱的,举个栗子
List<Integer> numList=new ArrayList<>();
numList.add(1);
numList.add(2);
当你取第一个时numList.get(0);(下标从0开始)
打印它出来还是:1
List 接口下ArrayList 特点是: 插入数据 有序且可重复 适合查找多增删少。
list是有序的,是以数组的存储方式进行存储.也就是说数组什么样它就什么样,唯一的区别就是,它没有固定大小. 且list的检索效率比较高,不过要频繁的对这个容器里的元素进行更新就不要用它了,用linkedlist比较好.
2. Set不一定无序
我们经常听说List是有序且重复的, Set 是无序不重复的。这里有个误区,这里说的顺序有两个概念,一是按添加的顺序排列,二是按自然顺序 a-z 排列。 Set 并不是无序的,传统说的
Set 无序是指 HashSet, 它不能保证元素的添加顺序,更不能保证自然顺序,而 Set 的其他实现类是可以实现这两种顺序的。
先来看看一段测试代码:
import java.util.*;
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.print(arrList + " ");
}
System.out.println();
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.print(linkList + " ");
}
System.out.println();
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.print(hashst + " ");
}
System.out.println();
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.print(linkedst + " ");
}
System.out.println();
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.print(treest + " ");
}
System.out.println();
}
}
插入的顺序为 s1 s3 s4 s5 s2 时,运行结果:
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
Process finished with exit code 0
我们通常说的 List 是有序的指的就是最后集合中的元素顺序就是按照添加时候的顺序排列的(无论是实现类 ArrayList, 还是 LinkedList)。但是我们发现 Set 所谓的无序就是在 HashSet 这个实现类中才会出现的这种情况,而 LinkedHashSet 已经和 List 的结果相同了,再看 TreeSet 实现的功能是根据元素的自然顺序排列了。
下面可以总结一张表格
类型 | 是否可以重复 | 是否保证元素添加的顺序 | 保证元素自然的顺序(A-Z) |
List | 是 | 是 | 否 |
HashSet | 否 | 否 | 否 |
LinkedHashSet | 否 | 是 | \ |
TreeSet | 否 | 否 | 是 |