Arraylist源码分析
2017-06-30 20:14
363 查看
1.ArrayList是基于数组实现的。由此会产生一些问题,数组大小是固定的,Arraylist是支持动态增加的,那又是如何做到的。今天看了下源码,和大家分享下。
2.
2.
public boolean add(E e) { //首先是这个函数 ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; } private void ensureCapacityInternal(int minCapacity) { //第一次增加元素会执行下面的代码,minCapacity=10 if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); } //紧接着执行这个函数 ensureExplicitCapacity(minCapacity); } private void ensureExplicitCapacity(int minCapacity) { modCount++; //第一次增加元素会执行grow(minCapacity)函数,当minCapacity=11时,此时elementData.length=10,此时数组已经满了,应该进行扩容, // overflow-conscious code if (minCapacity - elementData.length > 0) grow(minCapacity); } //扩容函数 private void grow(int minCapacity) { // overflow-conscious code System.out.println("开始扩容"); 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就变成了容量为10个元素的数组,如果接下来插入的数据不到十个就不会扩容,扩容的话,就是复制原来的数组,给定新的容量。 elementData = Arrays.copyOf(elementData, newCapacity); }
相关文章推荐
- ArrayList源码分析
- java 集合ArrayList及LinkList源码分析
- ArrayList源码分析(基于JDK1.6)
- Java集合框架源码分析之ArrayList
- Java concurrent Framework并发容器之CopyOnWriteArrayList(1.6)源码分析
- ArrayList源码分析
- Java Collections Framework之ArrayList源码分析(基于JDK1.6)
- java 集合ArrayList及LinkList源码分析
- ArrayList源码分析(基于JDK1.6)
- <原创> JAVA ArrayList源码分析(基于JDK7)
- java 集合ArrayList及LinkList源码分析
- ArrayList 源码分析
- java源码分析之ArrayList
- JDK源码分析之java.util.ArrayList
- 集合框架源码分析三(实现类篇ArrayList,LinkedList,HashMap)
- android播放器(music player)源码分析3(页面解析,ArrayListCursor)
- Java源码分析 – ArrayList动态数组列表源码分析
- 集合框架源码分析三(实现类篇ArrayList,LinkedList,HashMap)
- ArrayList源码分析
- ArrayList源码分析