ArrayList源码详细分析JDK1.8(二)

前言

ArrayList源码详细分析JDK1.8(一)中我们详细分析了ArrayList中最核心的add方法。

1.数据结构

ArrayList的底层数据结构是一个数组
在这里插入图片描述

1.属性

//上图中的数组
transient Object[] elementData; 
//元素个数
private int size;

2.Object get(int index)

功能描述:返回集合中指定位置上的对象

//E是泛型,向ArrayList中存入什么类型,E就是什么类型
public E get(int index) {
		//判断是否越界
        rangeCheck(index);
		//取出这个对象
        return elementData(index);
}

rangeCheck()

判断越界

private void rangeCheck(int index) {
		//大于数组存储元素的个数,抛出越界异常
        if (index >= size)
            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}

elementData()

取出数组中取出对象

E elementData(int index) {
        return (E) elementData[index];
    }

3.int size()

功能描述:返回集合中的元素个数

public int size() {
		//返回size的值
        return size;
    }

4.Object remove(int index)

功能描述:从集合中删除指定index处的元素,返回该元素

源码

public E remove(int index) {
		//判断是否越界
        rangeCheck(index);
        modCount++;
        //取出这个对象
        E oldValue = elementData(index);
		//numMoved 等于要移动的元素个数
        int numMoved = size - index - 1;
        if (numMoved > 0)
        	//图二,图三
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        //图四
        elementData[--size] = null;
		//返回要remove的那个元素
        return oldValue;
    }

图解

图一:

假设 remove(1),即 index = 1。

在这里插入图片描述
图二:
numMoved = size - index -1 = 4 - 1 - 1 = 2

System.arraycopy(elementData, index+1, elementData, index,numMoved)
就是
System.arraycopy(elementData, 2, elementData, 1,2)
在这里插入图片描述
图三:
在这里插入图片描述
图四:
在这里插入图片描述

System.arraycopy()

public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);

arraycopy方法调用的是本地方法,navtive 方法是 Java 通过 JNI(Java本地库接口) 直接调用本地 C/C++ 库,可以认为native 方法相当于 C/C++ 暴露给 Java 的一个接口。

参数的含义是:
src - 源数组。
srcPos - 源数组中的起始位置。
dest - 目标数组。
destPos - 目标数据中的起始位置。
length - 要复制几个

测试

public static void main(String[] args) {
		Integer[] src = {100,200,300,400,500};
		System.arraycopy(src, 2, src, 1, 3);
		for (int i = 0; i < src.length; i++) {
			System.out.print(" "+src[i]);
		}
	}

结果:

100 300 400 500 500

5.void clear()

功能描述:清空集合中所有元素

public void clear() {
        modCount++;
        //数组中所有元素赋值为null
        for (int i = 0; i < size; i++)
        	//方便垃圾回收器回收
            elementData[i] = null;
        size = 0;
    }

6.Object set(int index,Object obj)

功能描述:用指定元素obj替代集合中指定位置上的元素

public E set(int index, E element) {
		//越界检查
        rangeCheck(index);
		//取出这个对象
        E oldValue = elementData(index);
        //将指定对象存入数组
        elementData[index] = element;
        //返回被替代的元素
        return oldValue;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值