Java总结 - List实现类ArrayList&LinkedList (2)

所以ArrayList其实已经想好了为我们的空集合做一个缓存,而当我们向空集合中添加数据的时候,elementData就会指向其他的对象,这个是add方法的源码范围,所以一会再说,到这第一个空参的构造方法已经介绍的差不多了,下面是有int类型参数的构造方法的源码实现

public ArrayList(int initialCapacity) { //不为0,按照指定长度创建数组 if (initialCapacity > 0) { this.elementData = new Object[initialCapacity]; } else if (initialCapacity == 0) { //为0就直接指向创建好的数组 this.elementData = EMPTY_ELEMENTDATA; } else { //参数不合法 throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity); } }

不用细说,这个是很容易的,也可以看出来为什么ArrayList要设计两个空数组以备使用,这个构造没什么可说的,那么下面就是以集合为参数的创建方式的源码

//将参数转换为ArrayList public ArrayList(Collection<? extends E> c) { //因为Collection中就定义了toArray方法,所以他的实现类就都会实现自己的toArray,所以可以直接调用返回数组而不会出错 elementData = c.toArray(); //如果返回的数组的长度不是空的数组的话 if ((size = elementData.length) != 0) { //防范c.ToArray错误不返回Object[] if (elementData.getClass() != Object[].class) //那么就将elementData中的元素都转换为Object类型 elementData = Arrays.copyOf(elementData, size, Object[].class); } else { //到这就是空数组,所以直接引用创建好的空数组即可,还能节省空间 this.elementData = EMPTY_ELEMENTDATA; } }

到这ArrayList的创建方式大概的就过了一边,那么下面的ArrayList的实现方法,我就只挑几个核心方法来看一下源码

add

首当其冲的就是add,我们使用一下ArrayList来add元素,然后我们进行代码走读,那么我们看一下源码

//使用 ArrayList<String> arrayList = new ArrayList<>(); arrayList.add("A"); //源码开始 public boolean add(E e) { modCount++; //代表操作ArrayList的次数,有关于fast-fail机制,之后再说 //参数值:并不是A参数是一个URL, 数组对象 , 2 add(e, elementData, size); //调用类中方法 return true; //返回结果 } // 结束代码

上面可以说是很简单了,但是在debug的时候我发现存储元素的elementData数组中其实已经有东西了,如下图

markdown_img_paste_2019012511374150

然后当我debug step over到结束代码的时候,程序跳到这这样一个代码

public synchronized void addURL(URL url) { if (closed || url == null) return; synchronized (unopenedUrls) { if (! path.contains(url)) { unopenedUrls.addLast(url); path.add(url); } } } //再跳 public InternalError(String message) { super(message); } //还跳 static { System.loadLibrary("instrument"); } //还有很多...

上面的一些代码其实不用知道其意思,但是可以告诉我们的是,ArrayList中的elementData不单纯是存储我们需要存储的元素的,而是在首次add的时候会借助elementData这个数组去加载一些文件或者其他东西,而在第二次add的时候就不需要这个步骤了,并且在首次加载完一些路径后或者库后,elementData就会将他们清除,以为已经加载上了,然后这时候才会来存储我们的元素,录了一段小视频,可以下载来看一下

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwsjsd.html