博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java ArrayList源码分析(转载)
阅读量:4677 次
发布时间:2019-06-09

本文共 2509 字,大约阅读时间需要 8 分钟。

1.ArrayList是一个相对来说比较简单的数据结构,最重要的一点就是它的自动扩容,可以认为就是我们常说的“动态数组”。

  来看一段简单的代码:

1 2 3 4 5
ArrayList
list = new ArrayList
(); list.add("语文: 99"); list.add("数学: 98"); list.add("英语: 100"); list.remove(0);

 

在执行这四条语句时,是这么变化的:

arraylist
其中,add操作可以理解为直接将数组的内容置位,remove操作可以理解为删除index为0的节点,并将后面元素移到0处。

2. add函数

当我们在ArrayList中增加元素的时候,会使用add函数。他会将元素放到末尾。具体实现如下:

1 2 3 4 5
public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; }

 

我们可以看到他的实现其实最核心的内容就是ensureCapacityInternal。这个函数其实就是自动扩容机制的核心。我们依次来看一下他的具体实现

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
private void ensureCapacityInternal(int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); } ensureExplicitCapacity(minCapacity); } 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; // 扩展为原来的1.5倍 int newCapacity = oldCapacity + (oldCapacity >> 1); // 如果扩为1.5倍还不满足需求,直接扩为需求值 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.5倍,之后的操作就是把老的数组拷到新的数组里面。例如,默认的数组大小是10,也就是说当我们add10个元素之后,再进行一次add时,就会发生自动扩容,数组长度由10变为了15具体情况如下所示:

arraylistadd

3 set和get函数

Array的put和get函数就比较简单了,先做index检查,然后执行赋值或访问操作:

1 2 3 4 5 6 7 8 9 10 11 12 13
public E set(int index, E element) { rangeCheck(index); E oldValue = elementData(index); elementData[index] = element; return oldValue; } public E get(int index) { rangeCheck(index); return elementData(index); }

 

4 remove函数

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
public E remove(int index) { rangeCheck(index); modCount++; E oldValue = elementData(index); int numMoved = size - index - 1; if (numMoved > 0) // 把后面的往前移 System.arraycopy(elementData, index+1, elementData, index, numMoved); // 把最后的置null elementData[--size] = null; // clear to let GC do its work return oldValue; }

注释很清楚:

Removes the element at the specified position in this list. Shifts any subsequent elements to the left (subtracts one from their indices).

转载于:https://www.cnblogs.com/mr-wuxiansheng/p/6504818.html

你可能感兴趣的文章
转:在Nginx上配置多个站点
查看>>
leetcode : Remove Duplicates from Sorted List II [基础]
查看>>
常用正则汇集
查看>>
暑假集训 || 网络流
查看>>
吉日嘎拉DotNet.BusinessV4.2中的一处bug,及我的修复和扩展
查看>>
JVM学习笔记(一)JDK&JRE&JVM
查看>>
云计算商家必争之地 推荐几款云平台
查看>>
[转]B树(多向平衡查找树)详解
查看>>
ORACLE表、表分区、表空间的区别
查看>>
Windows7系统运行hadoop报Failed to locate the winutils binary in the hadoop binary path错误
查看>>
Arcgis 10.1安装
查看>>
关机时长时间停留在”正在保存设置“的解决办法
查看>>
vue使用video.js解决m3u8视频播放格式
查看>>
Ubuntu下配置使用maven
查看>>
常用sql语句
查看>>
13.无名管道通讯编程
查看>>
Kendo UI grid 表格数据更新
查看>>
js获取页面宽度给JS div设宽度
查看>>
如何恢复IIS出厂默认设置
查看>>
17.11.09
查看>>