Java集合--ArrayList(一)
2017-10-14 22:00
393 查看
ArrayList源码解析
1.成员变量//默认初始容量 private static final int DEFAULT_CAPACITY = 10; //AratList的大小 private int size; //AratList最大容量 private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; //空的数组, private static final Object[] EMPTY_ELEMENTDATA = {}; //空的数组,初始化时使用 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; //用于缓存要操作的数据 transient Object[] elementData;
2.构造函数
//空构造函数 public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; } //带初始化大小的构造函数 public ArrayList(int initialCapacity) { if (initialCapacity > 0) { this.elementData = new Object[initialCapacity]; } else if (initialCapacity == 0) { this.elementData = EMPTY_ELEMENTDATA; } else { throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); } } //带集合的构造函数 public ArrayList(Collection<? extends E> c) { elementData = c.toArray(); if ((size = elementData.length) != 0) { // 注解1 if (elementData.getClass() != Object[].class) elementData = Arrays.copyOf(elementData, size, Object[].class); } else { // replace with empty array. this.elementData = EMPTY_ELEMENTDATA; } }
3.主要方法(部分)
//添加元素 public boolean add(E e) { //判断当前集合容量大小是否够用,不够用扩容 ensureCapacityInternal(size + 1); elementData[size++] = e; return true; } public void add(int index, E element) { //检查index是否合法(是否越界和是否为0) rangeCheckForAdd(index); ensureCapacityInternal(size + 1); // System.arraycopy(elementData, index, elementData, index + 1,size - index); elementData[index] = element; size++; } public boolean addAll(Collection<? extends E> c) { Object[] a = c.toArray(); int numNew = a.length; ensureCapacityInternal(size + numNew); // Increments modCount System.arraycopy(a, 0, elementData, size, numNew); size += numNew; return numNew != 0; } public boolean addAll(int index, Collection<? extends E> c) { rangeCheckForAdd(index); Object[] a = c.toArray(); int numNew = a.length; ensureCapacityInternal(size + numNew); // Increments modCount int numMoved = size - index; if (numMoved > 0) System.arraycopy(elementData, index, elementData, index + numNew, numMoved); System.arraycopy(a, 0, elementData, index, numNew); size += numNew; return numNew != 0;
}
System.arraycopy()方法的解释。
public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
src:原数组
srcPos:原数组开始下标
dest:目标数组
destPos:目标数组放置下标
length:长度
作用:实现数组的复制
举例说明:
int[] fun ={0,1,2,3,4,5,6};
System.arraycopy(fun,0,fun,3,3);
结果:则结果为:{0,1,2,0,1,2,6};
这个方法是如何实现数组的添加/删除元素的呢
关键在于:System.arraycopy(elementData, index, elementData, index + 1,size - index);
举例:
List list = new ArrayList(); list.add(0); list.add(1); list.add(2); list.add(3); list.add(1, 4); list.remove(1);
执行前:elementData = [0,1,2,3]
System.arraycopy(elementData ,1elementData ,2,3);
执行后:elementData = [0,1,1,2,3]
然后elementData[index] = element;
将1位置的1替换为4;这样完成了一个元素的插入;elementData = [0,4,1,2,3]
删除也是一样的道理。
比如 list.remove(1);
执行前:elementData = [0,4,1,2,3]
System.arraycopy(elementData, index+1, elementData, index, size - index - 1);
执行后:elementData = [0,1,2,3,3]
然后elementData[–size] = null;
将最后一个3置为null;完成删除,elementData = [0,1,2,3]。
注解1:http://blog.csdn.net/huzhigenlaohu/article/details/51702737
未完待续
相关文章推荐
- Java集合(一) CopyOnWriteArrayList
- java中集合类HashSet、ArrayList、LinkedList总结
- Java 集合系列04之 fail-fast总结(通过ArrayList来说明fail-fast的原理、解决办法)
- Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例
- Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例
- Java中如何克隆集合——ArrayList和HashSet深拷贝
- 【Java】ArrayList集合容器
- 深入Java集合学习系列:ArrayList的实现原理
- JAVA集合二 ——list(02、ArrayList)
- JAVA集合(二)-ArrayList
- Java 集合:HashSet 与 ArrayList
- 深入Java集合学习系列:ArrayList的实现原理
- 转:【Java集合源码剖析】ArrayList源码剖析
- JAVA之ArrayList迭代时对集合进行增改操作
- 【Java集合源码剖析】ArrayList源码剖析
- java 集合ArrayList及LinkList源码分析
- 集合框架ArrayList+JAVA学习笔记-DAY16
- java中集合类HashSet、ArrayList、LinkedList总结
- Java 集合中List和ArrayList的区别
- Java集合(8)——ArrayList源码解析