文章目录
ArrayList
List接口特征:
-
有序性:list中的元素是按照他们被添加的顺序存储的,可以通过索引来访问list中的元素。
-
可重复性:list中可存储重复的元素
-
索引访问:可以根据元素的索引值来访问list中的元素。
-
支持迭代器:list实现了迭代器接口。(List接口继承Collections,Collections继承迭代器接口)
-
支持泛型
ArrayList实现List接口,允许null元素,底层采用数组实现。为了追求效率,ArrayList没有实现同步,可以出现线程安全问题。
arrayList的自动扩容机制
当向数组中添加元素,会进行容量的检查。数据扩容通过一个公开方法ensureCapacity(int minCapacity)
实现。可以手动调用,减少递增式再分配数量。扩容操作最终会通过grow()
方法完成。
数组扩容,会将老数组的元素重新拷贝到一份到新的数组中,数组容量增长到大约原先的1.5倍。
private void grow(int minCapacity) {
// overflow-conscious code
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 = Arrays.copyOf(elementData, newCapacity);
}
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
System.arraycopy和Arrays.copyOf 的对比:
-
作用:用来复制数组。
-
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
system.arraycopy本地方法,效率非常高。 -
public static <T> T[] copyOf(T[] original, int newLength)
,用来将一个数组复制到一个新的数组中,并且可以指定新数组的长度。 -
Arrays.copyOf只能用来复制对象类型的数组,返回一个泛型数组。优点易于使用和更加安全,会进行源数组的和目标数组的类型。
-
System.arrayCopy性能好,可以用来复制任意类型的数组。
ArrayList对于指定index的操作,首先会进行数组越界检查。
Fail-Fast操作
快速失败机制,通过记录modCount参数实现。在面对并发的修改时,迭代器很快就会完全失败。
标签:Java,int,ArrayList,list,newCapacity,minCapacity,数组 From: https://blog.csdn.net/2401_89378531/article/details/144221091