数组关于我们来说并不生疏,在内存中是一块延续的内存空间,经过下标可以随机拜访数组元素 如图一所示,而在JDK中提供了功用愈加弱小的ArrayList其底层是基于数据完成的,为什么JDK曾经提供了数据还要运用ArrayList呢?我们经过比较两者之间的差异来聊聊ArrayList的优势
java数组中如何获取数组实践元素
在面试中常常会问在java中数组长度和ArrayList中的size的区别?
经过下面的代码我们其实曾经看出来数组获取其长度的时分永远是在声明的时分定义的长度,即使数组中只要一个元素,经过下面的输入有人会问arr[1]输入的是0,这个是由于 int 类型在java中为基本类型所以在初始化数组时会默许用0填充
在ArrayList中的长度为list中实践元素的数量,这一点跟数组有着清楚的差别,详细如何完成前面会依据源码剖析
数组删除元素和添加元素
在数组中删除一个元素后需求移动元素保证数组的延续性,假设删除的是数组最后一个元素则不需求移动,假设删除了下标为3的元素后使数组延续则需求将3号元素后的元素依次向前移动
删除元素后下标为7的元素不再含有有效元素,假设我们运用的数组删除数据后这些移动的操作需求我们写相关的代码来完成,运用ArrayList删除与数据移动都将自动完成不需求我们手动处置
在数组中添加元素假设插入元素后元素个数超过了数组的长度则会报数组越界的错误,这是由于数组的容量是固定的不能静态的添加
如下图原数组容量为8假设想要成功添加第9个元素则需求将原来数组容量扩展为9然后移动指定位置的元素并将9插入,正由于这样数组不具有静态性因此在运用数据时需求额外思索很少数组本身的成绩招致不能专注于中心代码的编写
ArrayList的出现正式处置了数组存在以下成绩
静态扩容
有效数据长度
添加删除元素后数据移动
数据遍历
结合ArrayList一些面试成绩来看下详细源代码
ArrayList的默许初始化容量
何时扩容
扩容容量大小
遍历删除fast fail原理
迭代器删除为什么不越界
首先看下ArrayList的两个重要的属性
elementData 存储数据的数组
size 数组中实践元素个数
transient Object[] elementData; // non-private to simplify nested class access
/**
* The size of the ArrayList (the number of elements it contains).
*
* @serial
*/
private int size;
ArrayList 的结构函数分为有参和无参两种方式
无参结构函数为ArrayList()其初始化后并未分配内存空间而是在第一次add操作时分配
有参结构函数ArrayList(int initialCapacity)初始化即分配制定大小内存
有参结构函数ArrayList(Collection c) 初始化即分配内存
成绩一: 无参初始化默许容量是多少,何时扩容,扩容大小为多少都在下面的注释中可以找到
详细剖析请看下面注释
// 默许初始化elementData为空数组
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
//接上去停止add操作
public boolean add(E e) {
// 反省以后数据容量能否充足
ensureCapacityInternal(size + 1); // Increments modCount!!
// size 自增可以保证有效元素的个数
elementData[size++] = e;
return true;
}
//计算容量大小主要用于默许初始化第一次add操作
(责任编辑:admin)