java arraylist底层实现原理_ArrayList的底层实现原理

//elementData中已存放的元素的个数,注意:不是elementData的容量

private intsize;//elementData的默认容量为10

private static final int DEFAULT_CAPACITY = 10;//对象数组:ArrayList的底层数据结构,transient表示该字段不进行序列化操作

transientObject[] elementData;//实例化一个空数组

private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA ={};//实例化一个空数组

private static final Object[] EMPTY_ELEMENTDATA ={};protected transient int modCount = 0;

@Nativepublic static final int MAX_VALUE = 0x7fffffff;private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;/*** 向elementData末尾中添加元素

*/

public booleanadd(E e) {//确保对象数组elementData有足够的容量,可以将新加入的元素e加进去

ensureCapacityInternal(size + 1);//加入新元素e,size加1

elementData[size++] =e;return true;

}//minCapacity = seize+1,即表示执行完添加操作后,数组中的元素个数

private void ensureCapacityInternal(intminCapacity) {//判断是否是空数组

if (elementData ==DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {//用最小容量和10进行比较,取最大值赋值给最小容量

minCapacity =Math.max(DEFAULT_CAPACITY, minCapacity);

}

ensureExplicitCapacity(minCapacity);

}/***确保数组的容量足够存放新加入的元素,若不够,要扩容

*/

private void ensureExplicitCapacity(intminCapacity) {

modCount++;//如果数组个数minCapacity (size+1)大于数组长度就需要进行扩容

if (minCapacity - elementData.length > 0)

grow(minCapacity);

}private void grow(intminCapacity) {int oldCapacity =elementData.length;//将旧的数组容量增加为原来的1.5倍作为新的容量

int newCapacity = oldCapacity + (oldCapacity >> 1);//如果新的容量小于数组个数,将数组个数赋值给新容量

if (newCapacity - minCapacity < 0)

newCapacity=minCapacity;//如果新的容量大于最大容量,就根据数组个数来决定新的容量大小

if (newCapacity - MAX_ARRAY_SIZE > 0)

newCapacity=hugeCapacity(minCapacity);//根据新的容量,将数组拷贝到新的数组并赋值给数组

elementData =Arrays.copyOf(elementData, newCapacity);

}private static int hugeCapacity(intminCapacity) {//如果数组个数小于0抛出OutOfMemoryError异常

if (minCapacity < 0) //overflow

throw newOutOfMemoryError();//如果最数组个数大于最大容量 就返回最大值,否则返回最大容量

return (minCapacity > MAX_ARRAY_SIZE) ?Integer.MAX_VALUE :

MAX_ARRAY_SIZE;

}/*** 向elementData指定位置添加元素

*/

public void add(intindex, E element) {//指定位置检查

rangeCheckForAdd(index);//扩容检查

ensureCapacityInternal(size + 1); //Increments modCount!!//通过拷贝使数组内位置为 index 到 (size-1)的元素往后移动一位

System.arraycopy(elementData, index, elementData, index + 1,

size-index);//找到位置添加元素

elementData[index] =element;//元素个数加一

size++;

}//判断指定位置是否超出数组个数

private void rangeCheckForAdd(intindex) {if (index > size || index < 0)throw newIndexOutOfBoundsException(outOfBoundsMsg(index));

}/***@paramsrc 原数组.

*@paramsrcPos 原数组的起始位置.

*@paramdest 目标数组.

*@paramdestPos 目标数组的起始位置.

*@paramlength 拷贝长度.

*/

public static native void arraycopy(Object src, intsrcPos,

Object dest,intdestPos,int length);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值