ArrayList简单的源码分析

来源:互联网 发布:mac如何查看文件大小 编辑:程序博客网 时间:2024/05/16 06:56

ArrayList本质上是一个动态数组,该类实现了List接口。
Uml图如下:
这里写图片描述
动态数组的实现方法在 ArrayList类中的一个grow(int minCapacity) 的方法中,代码如下
这里写图片描述

首先在初始化Arraylist的代码的时候,如果不指定长度,那么会按照默认的长度10来指定这个list的长度,至于为什么要指定这个长度呢?其实就是为了防止在代码中多次的Arrays.copy来复制数组,提高性能的。至于Arraylist的长度,是在add(E e)中的自增的一个size,而并非数组的长度。
这里写图片描述

作为一个动态数组,我认为在实际的开发过程中,最主要的一个功能是遍历。在arraylist中有为我们提供了一个方法叫iterator()来实现的,iterator
中的方法就一句好,new Itr()。我们来看下,Itr类是的实现,源码如下:
这里写图片描述

首先定义一个cursor的游标变量,size为Arraylist的长度,如果cursor等于size的是否,hasNext比较返回为 false,那么循环没有必要走下去,next中,用游标找到对应的数组值。观察这个类,可以发现iterator和foreach的一点不同,就是在iterator中提供了一个remove的方法,如果在foreach中删除,并将报ConcurrentModificationException这么一个异常。在Iterator中的处理方式是:在next中记录了一个lastRet的值,在remove中找不并删除。然后把cursor放到lastRet指向的位置。
这里写图片描述
爱代码,更爱生活。如果有什么错误或者想法交流的,希望大家加我的qq:1416011240。学习不仅仅是知识,还有做人的道理。谢谢

原创粉丝点击