集合
1.概述
-
List,Set,Map都是借口,前两个继承Collection接口,Map为独立接口。
-
Set下有HashSet,LinkedHashSet,TreeSet
-
List下有ArrayList,Vector,LinkedList
-
Map下有Hashtable,LinkedHashMap,HashMap,TreeMap
-
Collection接口下还有个Queue队列接口,有PriorityQueue类
2.注意
Queue接口与LIst,Set同一级别,都是继承了Collection接口
即在方法中的参数类型如果是Queue时,LinkedList就完全只能访问Queue接口所定义的方法 了,而不能直接访问 LinkedList的非Queue的方法
SortedSet是个接口,它里面的(只有TreeSet这一个实现可用)的元素是一定有序的
3.总结
Connection接口:
List有序,可重复
-
ArrayList
优点:底层数据结构是数组,查询快,增删慢
缺点:线程不安全,效率高
-
Vector
优点:底层数据结构是数组,查询快,增删慢
缺点:线程安全,效率低
-
LinkedList
优点:底层数据结构是链表,查询慢,增删快
缺点:线程不安全,效率高
Set无序,不重复(唯一)
-
HashSet
底层数据是Hash表,无序、唯一
如何保证元素唯一性?
依赖两个方法hashCode() 和euqals()
-
LinkedHashSet
底层数据结构是链表和哈希表(FIFO插入有序且唯一)
1.由链表保证元素有序
2.由哈希表保证元素唯一
-
TreeSet
底层数据结构是红黑树(唯一,有序)
1.如何保证元素排序
自然排序
比较器排序
2.如何保证元素唯一性
根据比较返回值是否为0判断
针对Collection集合我们到底使用谁呢?
唯一吗? • 是:Set • 排序吗? • 是:TreeSet或LinkedHashSet • 否:HashSet • 如果你知道是Set,但是不知道是哪个Set,就用HashSet。 • 否:List • 要安全吗? • 是:Vector • 否:ArrayList或者LinkedList • 查询多:ArrayList • 增删多:LinkedList • 如果你知道是List,但是不知道用哪个,就用ArrayList。 • 如果你知道是Collection集合,但是不知道使用谁,就用ArrayList。 • 如果你知道用集合,就用ArrayList。
TreeSet,LinkedHashSet和HashSet的区别
1.介绍 TreeSet, LinkedHashSet and HashSet 在java中都是实现Set的数据结构 TreeSet的主要功能用于排序 LinkedHashSet的主要功能用于保证FIFO即有序的集合(先进先出) HashSet只是通用的存储数据的集合 2.相同点 Duplicates elements: 因为三者都实现Set interface,所以三者都不包含duplicate elements Thread safety: 三者都不是线程安全的,如果要使用线程安全可以Collections.synchronizedSet() 3.不同点 HashSet插入数据最快,其次LinkHashSet,最慢的是TreeSet因为内部实现排序 HashSet不保证有序,LinkHashSet保证FIFO即按插入顺序排序,TreeSet安装内部实现排序,也可以自定义排序规则 HashSet和LinkHashSet允许存在null数据,但是TreeSet中插入null数据时会报NullPointerException
Map接口:
-
Map接口有三个比较重要的实现类,分别是HashMap,TreeMap和HashTable
-
TreeMap是有序的,HashMap和HashTable是无序的。
-
Hashtable的方法是同步的,HashMap的方法不是同步的,这是两者最主要的区别
这就意味着:
-
Hashtable是线程安全的,HashMap线程不安全
-
HashMap效率较高,HashTable效率较低
如果对同步性和遗留代码的兼容性没有任何要求,建议使用HashMap,查看HashTable的元,啊就能发现,除构造函数以外,Hashtable的所有public方法声明中都有synchronized关键字,而HashMap的源码中没有。
-
HashTable中不允许有空值,而HashMap允许有null(Key和value都可以)
-
父类不同,Hashtable的父类是Dictionary,HashMap的父类是AbstractMap