Set
- HashSet
基于哈希表实现,支持快速查找,但不支持有序性操作。并且失去了元素的插入顺序信息,也就是说使用迭代器遍历HashSet得到的结果是不确定的 - LinkedHashSet
具有HashSet的查找效率,且内部使用双向链表维护元素的插入顺序 - TreeSet
基于红黑树实现,支持有序性操作,但是查找效率不如HashSet。HashSet查找的时间复杂度为O(1),TreeSet查找的时间复杂度为O(lgn)
import java.util.*;
public class Main {
public static void main(String[] args) {
Set<Integer> seta=new HashSet<>();
Set<Integer> setb=new TreeSet<>();
Set<Integer> setc=new LinkedHashSet<>();
Random random=new Random();
for(int i=0;i<10;i++) {
System.out.println(random.nextInt(100));
}
int []num=new int[]{66,58,23,3,5,3,38,60,9,51};
for(int a:num) {
seta.add(a);
setb.add(a);
setc.add(a);
}
System.out.println("HashSet: "+seta);
System.out.println("TreeSet: "+setb);
System.out.println("LinkedHashSet: "+setc);
}
}
HashSet: [66, 3, 51, 5, 38, 23, 9, 58, 60]
TreeSet: [3, 5, 9, 23, 38, 51, 58, 60, 66]
LinkedHashSet: [66, 58, 23, 3, 5, 38, 60, 9, 51]
从输出结果可以看出,HashSet的存储是随机的,无法预知输出的是怎样的顺序。LinkedHashSet可以保证插入的顺序,输出时按照FIFO的原则输出。TreeSet可以保证插入以后的排序大小,即输出时会按元素的排列大小关系来输出