天天看点

Java集合源码学习(一)集合框架概览

java集合框架包含了大部分java开发中用到的数据结构,主要包括

list列表、set集合、map映射、迭代器(iterator、enumeration)、工具类(arrays、collections)几个部分。

注意,在eclipse中使用ctrl+t查看collection接口的继承与实现关系,

会发现好多用于并发的相关容器,以及第三方的包实现了这个接口,这里只考察原生java集合里的一些常用实现,其他的接口也是。

Java集合源码学习(一)集合框架概览

(1)collection接口

collection是list、set等集合高度抽象出来的接口,它包含了这些集合的基本操作,主要分为list和set以及queue。

(2)list接口

list是一个继承于collection的接口,即list是集合中的一种。list是有序的队列,list中的每一个元素都有一个索引;第一个元素的索引值是0,往后的元素的索引值依次+1。和set不同,list中允许有重复的元素。

(3)set接口

set是一个继承于collection的接口,即set也是集合中的一种。set是没有重复元素的集合。

(4)queue接口

(5)iterator接口

iterator集合的迭代器。集合可以通过iterator去遍历集合中的元素。iterator提供的api接口,包括:是否存在下一个元素、获取下一个元素、删除当前元素。

(6)linkedlist类

linkedlist的本质是双向链表。

linkedlist继承于abstractsequentiallist,并且实现了dequeue接口。

linkedlist包含两个重要的成员:header和size。

header是双向链表的表头,它是双向链表节点所对应的类entry的实例。entry中包含成员变量:previous,next,element。其中,previous是该节点的上一个节点,next是该节点的下一个节点,element是该节点所包含的值。

size是双向链表中节点的个数。

linkedlist支持多种遍历方式。不要采用随机访问的方式去遍历linkedlist,而采用foreach逐个遍历的方式。

对元素的插入、添加、移除操作,与arraylist相比,linkedlist 更快,因为,当一个元素被添加到集合内部的任意位置时,linkedlist 不需要重新调整数组大小或者更新索引。

(7)arraylist类

arraylist是一个数组列表,相当于动态数组。与java中的数组相比,它的容量能动态增长。它继承于abstractlist,实现了list、randomaccess、cloneable、java.io.serializable这些接口。

arraylist实际上是通过一个数组去保存数据的。当我们构造arraylist时;若使用默认构造函数,则arraylist的默认容量大小是10。

当arraylist容量不足以容纳全部元素时,arraylist会重新设置容量:新的容量=“(原始容量x3)/2 + 1”。

(8)vector类

vector是矢量队列,和arraylist一样,它也是一个动态数组,由数组实现。但是arraylist是非线程安全的,而vector是线程安全的。

(9)stack类

stack是栈,它继承于vector。它的特性是:先进后出(filo, first in last out)。

先看一下类图关系:

Java集合源码学习(一)集合框架概览

下面针对类图中的实现进行简单分析。

(1)map接口

(2)hashmap类

hashmap基于哈希表的map接口的实现。,它存储的内容是键值对(key-value)映射。

hashmap继承于abstractmap,实现了map、cloneable、java.io.serializable接口。

hashmap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。

hashmap的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。此外,hashmap中的映射不是有序的。

hashmap是通过”拉链法”实现的哈希表。

(3)treemap类

treemap是有序的散列表,它是通过红黑树实现的。它一般用于单线程中存储有序的映射。

(4)weakhashmap类

weakhashmap也是基于“拉链法”实现的散列表,它一般也用于单线程程序中。相比hashmap,weakhashmap中的键是“弱键”,当“弱键”被gc回收时,它对应的键值对也会被从weakhashmap中删除;而hashmap中的键是强键。

(5)hashtable类

hashtable也是基于“拉链法”实现的散列表。hashtable的几乎所有函数都是同步的,即它是线程安全的,支持多线程。

hashtable的key、value都不可以为null,否则,会抛出异常nullpointerexception。

(6)directionary抽象类

(7)enumeration接口

arrays和collections是用来操作数组、集合的两个工具类,

例如在arraylist和vector中大量调用了arrays.copyof()方法,而collections中有很多静态方法可以返回各集合类的synchronized版本,即线程安全的版本。