参考: java6在线中文api
Java容器可分为两大类:
Collection
List
ArrayList
LinkedList
Vector(了解,已过时)
Set
HashSet
LinkedHashSet
TreeSet
Map
HashMap
LinkedHashMap
TreeMap
ConcurrentHashMap
Hashtable(了解,,已过时)
容器类图
1. 集合(Collection)
- Java是一门面向对象的语言,就免不了处理对象
- 为了方便操作多个对象,那么我们就得把这多个对象存储起来
- 想要存储多个对象(变量),很容易就能想到一个容器
- 常用的容器我们知道有StringBuffered,数组(虽然有对象数组,但是数组的长度是不可变的!),所以,Java就为我们提供了集合(Collection)。
1.1. 数组和集合的区别
1:长度的区别
数组的长度固定
集合的长度可变2:内容限制
数组存储的是同一种类型的元素
集合可以存储不同类型的元素(但是一般不这样干...)3:元素的数据类型
数组可以存储基本数据类型,也可以存储引用类型
集合只能存储引用类型(你存储的是简单的int,它会自动装箱成Integer)
1.2. Collection的特点与功能
集合可以存储多个元素,但我们对多个元素也有不同的需求,比如
- 1 多个元素,不能有相同的
-
2 多个元素,能够按照某规则排序
针对不同的需求,java就提供了很多集合类,把集合共性的内容不断往上提取,最终形成集合的继承体系:Collection
可以发现Collection的源码中继承了Iterable,且有iterator()这个方法。
Iterable是一个接口,它有iterator()这个方法,返回的是Iterator,Iterator也是一个接口,它只有三个方法: - hasNext()
- next()
- remove()
我们可以在ArrayList下找到了iterator实现的身影:它是在ArrayList以内部类的方式实现的!并且,从源码可知:Iterator实际上就是在遍历集合。
private class Itr implements Iterator<E> {...}
所以说,我们遍历集合(Collection)的元素都可以使用Iterator,至于它的具体实现是以内部类的方式实现的!
Collection继承关系:
上图的结构需要记住,但我们在实际开发过程中,要掌握的并不需要那么多,只需要掌握一些常用的集合类就行:Set,List,HashSet,LinkedHashSet,TreeSet,ArrayList,Vector
1.3. List集合
List接口继承了Collection接口,通过比较,可以发现多了哪些方法(略),List集合的特点就是:有序(存储顺序和取出顺序一致),可重复。
List集合常用的子类有三个:
- ArrayList
底层数据结构是数组。线程不安全 - LinkedList
底层数据结构是链表。线程不安全 - Vector
底层数据结构是数组。线程安全
1.4. Set集合
Set接口继承了Collection接口,Set集合的特点就是:元素不可重复。
Set集合常用子类:
- HashSet集合
底层数据结构是哈希表(是一个元素为链表的数组) - TreeSet集合
底层数据结构是红黑树(是一个自平衡的二叉树)
保证元素的排序方式 - LinkedHashSet集合
底层数据结构由哈希表和链表组成。
2. 映射(Map)
映射(Map)的模型图是这样的
2.1. Map的特点与功能
Map集合的特点:
将键映射到值的对象,一个映射不能包含重复的键,一个键只能对应一个值;-
Map和Collection的区别:
Map存储的元素是成对的,Map的键是唯一的,而值是可为空,可重复的;
Collection存储的元素是单独的,其子类中Set是唯一的,List是可重复的。
可以看出:
Map接口没有父类;
有一个内部类Entry,表示单独的键值对象;
有单独的分离键集合的方法;
有单独分离值集合的方法;
有单独分离键值对象集合的方法。
Map继承关系
上图的结构需要记住,但我们在实际开发过程中,需要数量掌握一些常用的类:Map,HashMap,HashTable,LinkedHashMap,TreeMap
- AbstractMap
抽象类,实现了大部分的Map接口。 - HashMap
在JDK8中HashMap的底层HashMap 是通过数组+链表(散列表)+红黑树实现的,它存储的内容是键值对(key-value)映射。
该类实现了Map接口,根据键的HashCode值存储数据,具有很快的访问速度,最多允许一条记录的键为null,不支持线程同步。 - HashTable
HashTable不能放null,会抛出NullPointerException,HashTable是同步的。 - TreeMap
继承了AbstractMap,基于红黑树,键、值都不能为null,使用元素的自然顺序对元素进行排序。 - LinkedHashMap
继承于HashMap,内部维持了一个双向链表,可以保持元素的插入顺序。
// TODO
- ArrayList源码解析
- LinkedList源码解析
- HashSet源码解析
- HashMap源码解析
- LinkedHashMap源码解析