java 集合框架-ArrayList
Posted 智公博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 集合框架-ArrayList相关的知识,希望对你有一定的参考价值。
在上一篇中我们描述了AbstractList的一些特性,包括迭代器的快速失败机制,这篇我们继续分享List下最常用的ArrayList以及非常类似的Vector,ArrayList具体实现类主要有以下特性:
- 支持动态大小,集合的大小可以自动扩展
- 不是线程同步安全,所有方法都不同步
- 实现支持迭代器快速失败Vector 容器在开发中比较少是用到,内部实现与特性基本都是与ArrayList一样的,只是他是同步容器,起始就是所有的外部操作方法都是使用了synchronized关键字的
两个容器都是使用一个Object[] 数组作为底层的容器存储,所以支持随机索引访问;对ArrayList和Vector这里只重点关注底层数组的改变:扩容、移除数据;
会导致扩容的方法有:add、addAll、ensureCapacity,ensureCapacity方法是保证集合大小满足指定大小,主要用于要开始插入大量数据前调用,一次性扩容到需要大小,避免重复扩容;
所有add方法都会先调用ensureCapacityInternal方法:
private void ensureCapacityInternal(int minCapacity)
if (elementData == EMPTY_ELEMENTDATA)
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
ensureExplicitCapacity(minCapacity);
该方法保证扩容大小最小为DEFAULT_CAPACITY,因为在没有指定初始化大小是,底层数组是 EMPTY_ELEMENTDATA=;
private void ensureExplicitCapacity(int minCapacity)
modCount++; //集合结构变化
// overflow-conscious code
if (minCapacity - elementData.length > 0) //保证扩容大小要大于当前数组大小
grow(minCapacity);
private void grow(int minCapacity)
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1); //增加当前大小1/2
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);
这段就是我们常说的ArrayList扩容会默认大小增加为当前大小的1/2,重点的数组扩容方法:Arrays.copyOf
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType)
T[] copy = ((Object)newType == (Object)Object[].class)
? (T[]) new Object[newLength]
: (T[]) Array.newInstance(newType.getComponentType(), newLength);
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
Arrays.copyOf 方法底层是使用 Native 方法 System.arraycopy,这个本地方法,肯定是要比新建数组,循环赋值要快速很多的,大家可以使用测试代码测试下速度差异;
同样所有的移除方法也是使用System.arraycopy进行了数组的复制;
以上是关于java 集合框架-ArrayList的主要内容,如果未能解决你的问题,请参考以下文章
深入理解java集合框架之---------Arraylist集合 -----构造函数