您的位置:首页 > 编程语言 > Java开发

ArrayList源码解析-JDK1.8

2019-05-05 17:24 99 查看

一、前言

ArrayList使我们常用到的集合之一,其底层的实现是一个数组,我们都知道数组的空间大小在我们定义的时候就赋值于一定的大小,当数组容量的满的时候,我们在想往里添加数据就得对数组进行扩容处理了。而ArrayList却不需要我们手动扩容,在源码中为我们自动扩容了。下面我们看一下ArrayList的源码。

  1. 数组的扩容

数组扩容,其实就是新建一个指定大小的数组将原来的数组复制进来而已。

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函数

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: