ArrayList源码解析-JDK1.8
一、前言
ArrayList使我们常用到的集合之一,其底层的实现是一个数组,我们都知道数组的空间大小在我们定义的时候就赋值于一定的大小,当数组容量的满的时候,我们在想往里添加数据就得对数组进行扩容处理了。而ArrayList却不需要我们手动扩容,在源码中为我们自动扩容了。下面我们看一下ArrayList的源码。
- 数组的扩容
数组扩容,其实就是新建一个指定大小的数组将原来的数组复制进来而已。
2.ArrayList
ArrayList是一个比较简单的数据结构,最重要的一点是它可以自动扩容,就是我们常说的“动态数组”。
实际上,ArrayList内部就是一数组实现的,这个数组有容量的限制,超出限制时会增加50%的容量,用System.arraycopy();复制到新的数组,因此虽好能给出数组大小的预估值。默认第一次插入元素是创建大小为10的数组。//容量为10不是size为10
按照数组下标访问元素-get(i),set(i,e)的性能很高,这是数组的基本优势。直接在数组的尾部加入元素add(e)的性能也很高,但是如果按下标插入、删除元素:add(i,e),remove(i),remove(e)则要用到System.arraycopy()来移动部分受影响的元素,性能也就变的差了点,这是数组基本劣势。下面对 这几个方法进行分析:
1.add函数
在ArrayList中增加元素,使用add函数。他会将元素放到末尾。具体的实现如下:
可以看到最核心的内容就是ensureCapacityInternal方法。这个函数就是自动扩容机制的核心了。然后我们看一下它是如何实现的:
也就是说,当增加数据的时候,如果ArrayList的大小已经不能满足需求时,那么就将数组长度变为n+(n>>1)倍,也就是1.5倍,之后的操作和上述数组扩容是一样的,将原来的数值复制到新的数组中,如果扩展1.5倍后,还是不够,则之间扩展为需求值。
2.set和get函数
ArrayList的set和get函数比较简单,先做index检查,然后执行复制或者访问操作,其中rangeCheck函数检查的是否越界问题,越界将抛出异常,中断运行:
3.remove函数
- ArrayList源码解析——JDK1.8
- ArrayList源码解析(jdk1.8)
- ArrayList源码解析(jdk1.8)
- JDK1.8 ArrayList源码解析
- JDK1.8 --- ArrayList-LinkedList源码解析
- Jdk1.8 Collections Framework源码解析(1)-ArrayList
- JDK之ArrayList源码解析
- HashMap 源码解析(jdk 1.8)
- 给jdk写注释系列之jdk1.6容器(1):ArrayList源码解析
- [Jdk1.8源码阅读]ArrayList
- Java -- 基于JDK1.8的ArrayList源码分析
- ArrayList源码分析(基于JDK1.8)
- JDK源码解析之ArrayList和LinkedList
- ArrayList源码分析(JDK1.8)
- ArrayList源码解析(基于JDK1.7)
- ArrayList源码分析(基于JDK1.8)
- ArrayList源码解析(基于JDK1.7)
- ArrayList从源码上看其线程安全问题(jdk1.8)
- Vector源码解析(jdk1.8)
- 【JDK1.8】JDK1.8集合源码阅读——ArrayList