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

目录

  • 前言
  • 1.数据结构
  • 1.属性
  • 2.Object get(int index)
    • rangeCheck()
    • elementData()
  • 3.int size()
  • 4.Object remove(int index)
    • 源码
    • 图解
    • System.arraycopy()
      • 测试
  • 5.void clear()
  • 6.Object set(int index,Object obj)

前言

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

1.数据结构

ArrayList的底层数据结构是一个数组
ArrayList源码详细分析JDK1.8(二)_第1张图片

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。

ArrayList源码详细分析JDK1.8(二)_第2张图片
图二:
numMoved = size - index -1 = 4 - 1 - 1 = 2

System.arraycopy(elementData, index+1, elementData, index,numMoved)
就是
System.arraycopy(elementData, 2, elementData, 1,2)
ArrayList源码详细分析JDK1.8(二)_第3张图片
图三:
ArrayList源码详细分析JDK1.8(二)_第4张图片
图四:
ArrayList源码详细分析JDK1.8(二)_第5张图片

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;
    }

你可能感兴趣的:(Java集合类源码分析)