Java中的集合
从JDK1.2开始java中新增了集合API,用于将所有集合进行统一归纳,形成了两种集合的解决方案:
- 单例集合
- 双列集合
单列集合有一个顶层的接口:Collection
双列集合有一个顶层接口:Map
Colection
Collecton是所有单列集合的顶层接口
其存在两个子接口:
- List:是一个有序的集合,并且允许重复的元素出现
- Set:是一个无序集合,并且不允许重复元素出现
List集合
List接口是一个有序的集合,内部允许重复的元素出现,并且元素的存储顺序是按照添加顺序存储,因此可以通过元素的索引位置快捷的搜索到目标元素;
List接口有几个常见的实现类:
- ArrayList
- LinkedList
- Vector
Set集合
Set是从jdk1.2开始出现,对比List集合,Set集合特点如下:
- 元素的存储顺序与添加顺序无关(无序)
- 内部不允许重复元素
Set接口一些常见的实现类:
- HashSet
- LinkedHashSet
- TreeSet
Map集合
Map集合是由键值对结构组成,通常由一个唯一键对应一个值,集合中存储的元素键不允许重复,但是值可以重复,Map集合是一个键值对集合的顶层接口。
常见的实现类主要有以下:
- HashMap
- TreeMap
- LinkeHashMap
- HashTable
HashMap
HashMap是Map中最常用的一个实现类,内部实现是基于数组+链表(JDK1.8之前;JDK1.8之后改为使用数组+链表+红黑树实现);元素的存储按照键值对的方式,存储顺序根据键的hashCode(包括equals)计算之后存储。
TreeMap
Map集合另外针对于排序的需求还有一个TreeMap的实现类,该类内部基于红黑树(平衡排序二叉树)实现;内部的元素存储顺序,由键对应的类型实现Comparable接口后,通过重写comparaTo方法实现;TreeMap的使用需要满足以下两个条件:
- key的类型必须一致
- key对应的类必须实现Comparable接口
HashTable
Hashtable也是键值对结构的集合解决方案,从jdk1.0之后就已经存在,从老式的集合类java.util.Dictionary继承而来,初始长度是11(HashMap是16),Hashtable是线程安全实现(HashMap是线程不安全的实现);Hashtable不允许空键值出现(HashMap允许)
LinkedHashMap
LinkedHashMap是基于链表的HashMap实现,本身也是从HashMap继承而来,通过链表实现内部元素的存储顺序保持与添加顺序一致。