ArrayList源码解析
来源:互联网 发布:电驴mac 怎么打开种子 编辑:程序博客网 时间:2024/05/14 12:04
放假,倍感无聊。兴起,观ArrayList源码,感之,故而记之。
整体的类结构图。在《thingking in java》第四版,17章可依完整的看到容器类的整体结构图。单看ArrayList的结构,看到一个完整的结构图。
Iterator > Collection >List >AbstractList >ArrayList 。
1,Iterable接口,javadoc对该类的解释比较简单,Implementing this interface allows an object to be the target of the "foreach" statement.可以简单的来看出,实现当前接口的类都可以使用foreach循环遍历。
2,Collection接口继承了Iterable接口。同时声明了一个集合类必须的一些成员变量和方法。
3,List<E> 接口继承Collection接口,增加了对于链表需要的方法和变量。
通过阅读List的javadoc文档,可以看出一些几点:
- Unlike sets, lists typically allow duplicate elements.
- they typically allow multiple null elements if they allow null elements at all.
- The <tt>List</tt> interface provides a special iterator, called a <tt>ListIterator</tt>
5,ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable。
6,ArrayList的初始化默认长度为10,
private static final int DEFAULT_CAPACITY = 10;
当然在代码中我们可以指定长度,ArrayList(int initialCapacit)。
7,ArrayList的add方法。
在平时的使用中,基本上都是调用一个add方法就行了,实际中,add方法在后台经历了好几种。下面可以来看看:
1) public boolean add(E e):在该方法内部,首先调用 ensureCapacityInternal(size + 1);
2)private void ensureCapacityInternal(int minCapacity):在ensureCapacityInternal方法内部,首先判断
if (elementData == EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
是不是当前对象维护的elementData是一个空数组,如果是的话,获取传入值和默认长度中的大数。
调用 ensureExplicitCapacity(minCapacity);
3)在 private void ensureExplicitCapacity(int minCapacity) 方法中, modCount++;(尚未看懂这个方法的作用)。
if (minCapacity - elementData.length > 0)
grow(minCapacity);判断传入值和当前维护数组的大小,如果大于当前维护数组。
4) private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity; 增加当前数组长度的一半长度。
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
5)增加
elementData[size++] = e;
return true;
- ArrayList 源码解析
- ArrayList源码解析
- android源码解析 -- ArrayList
- ArrayList源码解析
- ArrayList源码解析
- ArrayList源码解析
- ArrayList源码解析
- ArrayList LinkedList源码解析
- ArrayList 源码解析
- ArrayList集合源码解析
- ArrayList源码解析
- ArrayList类源码解析
- ArrayList源码解析
- ArrayList源码解析
- ArrayList 部分源码解析
- ArrayList源码解析
- ArrayList源码解析
- ArrayList源码解析
- Android中popWindow弹出菜单的编写
- hdu 1175 连连看
- asdf
- 二层广播(帧广播)和三层广播(路由器广播)有什么区别?
- The specified JRE installation does not exist--TomCat 错误解决
- ArrayList源码解析
- 运行startx后Ubuntu密码正确进不去的问题
- 回调函数
- Java高级视频_IO输入与输出(二)
- 关于DataAdapter打开和关闭连接
- ENetwork Chapter 7 - CCNA Exploration (Version 4.0)
- 从一个activity中启动另一个activity
- 坐标转换
- 聚类算法的MapReduce并行化分析