美文网首页
JDK源码阅读之旅(一)——ArrayList

JDK源码阅读之旅(一)——ArrayList

作者: 张天偿 | 来源:发表于2017-08-10 23:56 被阅读0次

    ArrayList是实现List接口的类中最为常用的。现在实习的公司基本上都在用这个。。

    首先我们来看下它的成员变量有哪些。

    序列化的ID 默认容量为10 空List时的内部数组 默认容量时内部的数组 真正存放内容的数组

    可以看到注释说明一旦有元素加入就把默认List扩展为默认容量的List

    ArrayList包含内容大小

    接下来看看它的构造方法们。

    1.

    可以定义初始容量的构造方法

    如果初始容量大于0,那么内部的数组指向一个新的对象数组,数组容量为initialCapacity。如果等于0,那么指向一开始定义的空数组。

    2.

    空的构造方法

    内部数组指向之前定义的那个空的但是有初始容量为10的数组?但是哪里定义这个数组容量为10了?可能后面才会写出来吧,先放着。

    3.


    参数为Collection接口的构造方法

    内部数组指向参数转化后的Array。如果大小为0的话,elementData指向空数组,否则进入下一个判断。下一个判断中是为了知道重新指向后的内部数组是不是还是Object数组类型,如果不是的话,要进行转化。看一下这个copyof方法。

    copyof方法

    两者相同类型那么就以新长度创建一个新的Object数组,不同那么就用Array类的newInstance创建新的实例。先看下这个方法和getComponentType方法。

    newInstance方法 newArray方法 获取类类型的componenttype

    说实话后面这几个方法有些难,看的不是很明白,因为后面触及到了native方法。

    总之,之前那一个copy变成了目标类型的具有新长度的数组。

    再回到那一步,调用System.arraycopy方法。其实就是将原始数组拷贝到目标数组,但是长度是两者的最小值。最后返回这个copy数组,完成拷贝。

    接下来看看它的几个常用成员方法。

    1.

    返回ArrayList大小

    2.

    判断是否为空

    3.

    判断某个对象是否在ArrayLIst中

    看一下这个indexOf方法如何实现的。

    indexOf方法

    可以看到如果为空的话也会在内部数组中检查是否有空值,并且返回第一次出现空值的位置。注意了这个方法找的都是第一个出现那个值的位置。不存在的话返回-1,因为第一个是0。

    4.

    lastindexOf方法

    这个方法跟indexOf方法类似,不过是从最后开始往前找,记下第一个出现兑现的位置。也是用的for循环查找。

    5.

    clone方法

    这个clone方法的作用与其他的clone方法类似,就是重新创建了一个对象并且将内部数组进行了复制。

    6.

    转为普通数组

    7.

    带参数的toArray方法

    内部要进行长度的判断,如果目标数组长度小的话,需要增加数组长度。如果长度一样就进行普通的拷贝。如果目标数组长度大的话,把目标数组多出来的位置置空。

    8.

    获取元素的get方法

    先看rangeCheck方法。

    检查是否越界

    如果大于原本的大小的话会抛出常见的越界异常。

    然后是elementData方法。

    elementData方法

    好吧,就是取了数组中的第几个元素。

    9.

    设置某个位置的值

    先是之前的rangeCheck方法检验是否越界。之后就将新的值设置进去,但是注意了,返回的是旧的值,也就是被替换掉的oldValue。

    10.

    在尾部添加元素

    11.

    某个特定位置加入元素

    将原数组复制到新的数组后,再把加入的元素放入目标位置。其实是把中间那个位置空出来,后面的元素往后移动一位。

    12.

    删除某个位置的元素

    和添加元素类似,将特定位置之后的元素全部提前,然后把最后那个元素置空值就行了,返回的还是那个oldValue。

    13.

    删除某个元素

    发现用到了fastRemove这个方法,那么看下这个方法。不过这只能删除第一个出现的那个元素。

    fastRemove方法

    这不就是那个remove方法么。。只不过没有返回值而已。

    14.

    clear方法

    for循环进行逐个置空,并且大小置为0。

    15.

    添加一整个集合

    16.

    某个位置后加入一个集合

    内部数组发生移动,空出位置给集合c。

    17.

    删除中间部分

    18.

    截取一部分List

    其中的SubList又是一个内部类,比较麻烦不详细介绍了。

    比较常用的就是以上这些了。

    相关文章

      网友评论

          本文标题:JDK源码阅读之旅(一)——ArrayList

          本文链接:https://www.haomeiwen.com/subject/tntzlxtx.html