Java集合详解
概述
- List , Set, Map都是接口,前两个继承至Collection接口,Map为独立接口
- Set下有HashSet,LinkedHashSet,TreeSet
- List下有ArrayList,Vector,LinkedList
- Map下有Hashtable,LinkedHashMap,TreeMap
- Collection接口下还有个Queue接口,有PriorityQueue类
注意:
- Queue接口与List、Set同一级别,都是继承了Collection接口
- 看图你会发现,LinkedList既可以实现Queue接口,也可以实现List接口.只不过呢, LinkedList实现了Queue接口。Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类型如果是Queue时,就完全只能访问Queue接口所定义的方法 了,而不能直接访问 LinkedList的非Queue的方法),以使得只有恰当的方法才可以使用。
- SortedSet是个接口,它里面的(只有TreeSet这一个实现可用)中的元素一定是有序的。
总结:
Collection接口:
List有序,可重复
- ArrayList
优点:底层数据结构是数组,查询快,增删慢
缺点:线程不安全,效率高
- Vector
优点:底层数据结构是数组,查询快,增删慢
缺点:线程安全,效率低
- LinkedList
优点:底层数据结构是链表,查询慢,增删快
缺点:线程不安全,效率高
Set无序,唯一
- HashSet
底层数据结构是哈希表。(无序,唯一)
如何来保证元素唯一性?
依赖两个方法:hashCode()和equals()
- LinkedHashSet
底层数据结构是链表和哈希表(FIFO插入有序,唯一)
1.由链表保证元素有序
2.由哈希表保证元素唯一
- TreeSet
底层是数据结构是红黑树(唯一,有序)
1.如何保证元素排序的呢?
自然排序
自然排序要进行一下操作:
- Student类中实现 Comparable接口
- 重写Comparable接口中的Compareto方法
比较器排序
比较器排序步骤:
- 单独创建一个比较类,这里以MyComparator为例,并且要让其继承Comparator接口
- 重写Comparator接口中的Compare方法
2.如何保证元素的唯一性?
根据比较的返回值是否是0来决定
Map接口:
Map接口有三个比较重要的实现类,分别是HashMap、TreeMap和HashTable。
- TreeMap是有序的,HashMap和HashTable是无序的。
- Hashtable的方法是同步的,HashMap的方法不是同步的。这是两者最主要的区别。
这就意味着:
- Hashtable是线程安全的,HashMap是线程不安全的。
- HashMap效率较高,Hashtable效率较低。
如果对同步性或与遗留代码的兼容性没有任何要求,建议使用HashMap。 查看Hashtable的源代码就可以发现,除构造函数外,Hashtable的所有 public 方法声明中都有 synchronized关键字,而HashMap的源码中则没有。
- Hashtable不允许null值,HashMap允许null值(key和value都允许)
- 父类不同:Hashtable的父类是Dictionary,HashMap的父类是AbstractMap
重点问题重点分析:
(一).TreeSet, LinkedHashSet and HashSet 的区别
TreeSet, LinkedHashSet and HashSet 在java中都是实现Set的数据结构
- TreeSet的主要功能用于排序
- LinkedHashSet的主要功能用于保证FIFO即有序的集合(先进先出)
- HashSet只是通用的存储数据的集合
- Performance and Speed: HashSet插入数据最快,其次LinkHashSet,最慢的是TreeSet因为内部实现排序
- Ordering: HashSet不保证有序,LinkHashSet保证FIFO即按插入顺序排序,TreeSet安装内部实现排序,也可以自定义排序规则
- null:HashSet和LinkHashSet允许存在null数据,但是TreeSet中插入null数据时会报NullPointerException