java collection源码_java collection 集合源码分析(一)

collection 为java集合的接口,collection的接口继承Iterable

public interface Collection extends Iterable

没有自己在画类图了 找到网上有大哥画的关系图如下

c1af198857ddcc7e9cd05145c96038c7.png

上图中有个位置可能错了,AbstrctList应该继承自

public abstract class AbstractList extends AbstractCollection implements List

一、List(接口)

1、ArrayList

内部持有一个Object[] 数组

/**

* Default initial capacity.

*/

private static final int DEFAULT_CAPACITY = 10;  //默认大小

/**

* Shared empty array instance used for empty instances.

*/

private static final Object[] EMPTY_ELEMENTDATA = {}; //对象数组

/**

* The array buffer into which the elements of the ArrayList are stored.

* The capacity of the ArrayList is the length of this array buffer. Any

* empty ArrayList with elementData == EMPTY_ELEMENTDATA will be expanded to

* DEFAULT_CAPACITY when the first element is added.

*/

private transient Object[] elementData;

/**

* The size of the ArrayList (the number of elements it contains).

*

* @serial

*/

private int size; //数组大小

所有的操作基于这个数组进行组织,一般不轻易对这个数组进行遍历,一般多用system.arraycopy的方式进行操作,删除的动作有时候依赖与gc来回收,如下删除方法:

/**

* Removes the element at the specified position in this list.

* Shifts any subsequent elements to the left (subtracts one from their

* indices).

*

* @param index the index of the element to be removed

* @return the element that was removed from the list

* @throws IndexOutOfBoundsException {@inheritDoc}

*/

public E remove(int index) {

rangeCheck(index);

modCount++;

E oldValue = elementData(index);

int numMoved = size - index - 1;

if (numMoved > 0)

System.arraycopy(elementData, index+1, elementData, index,

numMoved);  //通过副本的形式完成操作

elementData[--size] = null; // clear to let GC do its work

return oldValue;

}

2、LinkedList

LinkedList,内部持有一系列的Node ,node结构如下

private static class Node {

E item;

Node next;

Node prev;

Node(Node prev, E element, Node next) {

this.item = element;

this.next = next;

this.prev = prev;

}

}

从上可以看出 node中 保存了前一个和后一个的节点信息,和数据,分为三部分

对节点的管理如下:

transient int size = 0; //有多少节点

/**

* Pointer to first node.

* Invariant: (first == null && last == null) ||

*            (first.prev == null && first.item != null)

*/

transient Node first; //头节点

/**

* Pointer to last node.

* Invariant: (first == null && last == null) ||

*            (last.next == null && last.item != null)

*/

transient Node last; //尾节点

所有的操作围绕对节点的增删来操作,看一个添加所有的操作

/**

* Constructs a list containing the elements of the specified

* collection, in the order they are returned by the collection's

* iterator.

*

* @param  c the collection whose elements are to be placed into this list

* @throws NullPointerException if the specified collection is null

*/

public LinkedList(Collection extends E> c) {

this();

addAll(c);

}   //构造

/**

* Appends all of the elements in the specified collection to the end of

* this list, in the order that they are returned by the specified

* collection's iterator.  The behavior of this operation is undefined if

* the specified collection is modified while the operation is in

* progress.  (Note that this will occur if the specified collection is

* this list, and it's nonempty.)

*

* @param c collection containing elements to be added to this list

* @return {@code true} if this list changed as a result of the call

* @throws NullPointerException if the specified collection is null

*/

public boolean addAll(Collection extends E> c) {

return addAll(size, c);

}

/**

* Inserts all of the elements in the specified collection into this

* list, starting at the specified position.  Shifts the element

* currently at that position (if any) and any subsequent elements to

* the right (increases their indices).  The new elements will appear

* in the list in the order that they are returned by the

* specified collection's iterator.

*

* @param index index at which to insert the first element

*              from the specified collection

* @param c collection containing elements to be added to this list

* @return {@code true} if this list changed as a result of the call

* @throws IndexOutOfBoundsException {@inheritDoc}

* @throws NullPointerException if the specified collection is null

*/

public boolean addAll(int index, Collection extends E> c) {

checkPositionIndex(index);

Object[] a = c.toArray();

int numNew = a.length;

if (numNew == 0)

return false;

Node pred, succ;

if (index == size) {

succ = null;

pred = last;

} else {

succ = node(index);  //返回索引处的特征节点,这个方法会优化从头部还是从尾部查找的过程具体参看源码

pred = succ.prev;

}

for (Object o : a) {

@SuppressWarnings("unchecked") E e = (E) o;

Node newNode = new Node<>(pred, e, null);

if (pred == null)

first = newNode;

else

pred.next = newNode;

pred = newNode;

}  //添加过程

if (succ == null) {

last = pred;

} else {

pred.next = succ;

succ.prev = pred;

}

size += numNew;

modCount++;

return true;

}

3、Vector

arrayList类似,源码多处增加了synchronized 关键字,线程安全

二、Set(接口)

1、HashSet

HashSet内部实际持有的是一个hashmap对象,所有的操作都是通过操作map实现,这个map是无值,只有key,

内部的一个hashmap对象

private transient HashMap map;

public HashSet(Collection extends E> c) {

map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); //开辟一个比原有集合4/3大小的集合。默认16

addAll(c);

}

看一个获取迭代器的方法

/**

* Returns an iterator over the elements in this set.  The elements

* are returned in no particular order.

*

* @return an Iterator over the elements in this set

* @see ConcurrentModificationException

*/

public Iterator iterator() {

return map.keySet().iterator();

}

2、TreeSet

TreeSet也是通过map来实现

private transient NavigableMap m; //这里使用的是NavigableMap,这个继承自SortedMap接口 since1.6之后

其他的方法都是调用map的实现,在map中在看

Map 单立一章来写把

ps:以上的源码来自openjdk7u75-b13版本

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值