Java Collection复习整理

来源:互联网 发布:表格数据不多 格式大 编辑:程序博客网 时间:2024/06/07 23:49

1. Collection框架(咦为啥图片看不见。。。)

2. ArrayList

(1)    ArrayList介绍:

a)       ArrayList 继承了AbstractList,实现了List。提供了相关的添加、删除、修改、遍历等功能。

b)       ArrayList 实现了RandomAccess接口,Cloneable接口,java.io.Serializable接口。支持随机访问,克隆和序列化。

c)       ArrayList线程安全性:ArrayList中的操作不是线程安全的(区别于Vector)。在单线程中使用ArrayList,在多线程中可以选择Vector或者CopyOnWriteArrayList。

(2)  数据结构与源码分析

a)       通过一个数组去保存数据(Object[]类型数组,elementData),默认容量是10。

b)       容量不足以容纳全部元素时,新的容量=原始容量*3/2+1。

c)       克隆函数实现全部元素克隆到数组中。ArrayList写入输出流时,先写容量,再写每一个元素。读输入流时,先读容量再读每一个元素。

(3)    遍历方式:随机访问、循环遍历、迭代器(Iterator和ListIterator)。


3. LinkedList

(1)  LinkedList介绍:

a)       LinkedList 是一个继承于AbstractSequentialList的双向链表。

AbstractSequentialList 实现了get(int index)、set(int index, E element)、add(int index, Eelement) 和 remove(int index)这些函数。

b)       LinkedList 实现 List 接口,能对它进行队列操作。

c)       LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用。

d)       LinkedList 实现了Cloneable接口,即覆盖了函数clone(),能克隆。

e)       LinkedList 实现java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。

f)        LinkedList 是非同步的。

(2)  LinkedList数据结构:size、Node first、Nodelast

(3)  源码分析:

a)       顺序访问高效,随机访问效率低(get()方法是在List接口中定义的,LinkedList实现了List接口,所以也是可以随机访问的。)具体实现:实现了根据索引值来获取、删除节点的函数(size为计数索引值,比较get(location)中location和链表长度的一半比决定是从链表头还是链表尾开始查找。)

b)       不存在容量不足的问题。

c)       可以作为队列和栈。

(4)  遍历方式:

迭代器、随机访问(效率超低)、foreach(效率最高)、pollFirst()/pollLast()/removeFirst()/removeLast()


4. Vector。

(1)  Vector介绍:

a)       Vector 继承了AbstractList,支持相关的添加、删除、修改、遍历等功能。

b)       Vector 实现了RandmoAccess接口,实现了Cloneable接口,即实现clone()函数。它能被克隆。

c)       Vector是线程安全的。

(2) 数据结构:


a)       elementData 是Object[]类型的数组,它保存了添加到Vector中的元素。默认大小10。随着Vector中元素的增加,Vector的容量也会动态增长。

b)       elementCount 是动态数组的实际大小。

c)       capacityIncrement 是动态数组的增长系数。如果在创建Vector时,指定了capacityIncrement的大小;则每次当Vector中动态数组容量增加时,增加的大小都是capacityIncrement。否则容量增加一倍。

(3)  遍历方式:、随机访问、Enumeration、foreach、迭代器


5.  Stack。

(1)  Stack介绍:FILO,继承Vector,通过数组实现。

(2)  数据结构:

(3)  源码分析:

a)       Stack实际上也是通过数组去实现的。

b)       执行push时(即,将元素推入栈中),是通过将元素追加的数组的末尾中。

c)       执行peek时(即,取出栈顶元素,不执行删除),是返回数组末尾的元素。

d)       执行pop时(即,取出栈顶元素,并将该元素从栈中删除),是取出数组末尾的元素,然后将该元素从数组中删除。

e)       Stack继承于Vector,意味着Vector拥有的属性和功能,Stack都拥有。

 

6. List总结

(1)  框架图(图片不会传啊- -):

(2)  使用场景:

a)       如果涉及栈、队列、链表,考虑用List。

b)       对于需要快速插入,删除元素,应该使用LinkedList。

对于需要快速随机访问元素,应该使用ArrayList。

对于“单线程环境” 或者 “多线程环境,但List仅仅只会被单个线程操作”,此时应该使用非同步的类(如ArrayList)。

对于“多线程环境,且List可能同时被多个线程操作”,此时,应该使用同步的类(如Vector)。

(3)  ArrayList与LinkedList:插入/删除元素和随机访问元素的速度对比。

(4)  ArrayList和Vector:

相同:都是list(支持Iterator和ListIterator遍历),都支持随机访问和克隆自身,都是通过数组实现。

不同:线程安全性、序列化支持。(Vector没有实现java.io.Serializable接口)、容量增加方式、Vector支持Enumeration遍历。