博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ArrayList add方法深度解析。
阅读量:5980 次
发布时间:2019-06-20

本文共 2262 字,大约阅读时间需要 7 分钟。

hot3.png

ArrayList提供了四个方法添加元素,前两种添加一个元素,后两种为添加一Collection。

第一种我们前面已经见过并且分析过。我们看一下下面的图解以及代码

public boolean add(E e) {        //确保数组长度,不够则扩展        ensureCapacityInternal(size + 1);         //添加元素        elementData[size++] = e;        return true;    }

第二种是在指定的位置添加一个元素。System.arraycopy(elementData, index, elementData, index + 1,

size - index);这方法很重要,list元素的添加很大程度上都依赖这个方法。第一个参数为要复制的源数组,第二个参数为要复制的开始位置,第三个是要复制的目的数组,第四个参数是复制到目的数组的开始位置,第五个参数为要复制的长度。

public void add(int index, E element) {        //检查插入索引位置,超出范围,抛出异常,跟List长度作比较        rangeCheckForAdd(index);        //根据情况扩展数组长度,如果扩展数组长度,进行一次数组的复制        ensureCapacityInternal(size + 1);          //赋值新数组        System.arraycopy(elementData, index, elementData, index + 1,                         size - index);        //添加元素        elementData[index] = element;        //list长度加1        size++;    }private void rangeCheckForAdd(int index) {         //如果索引大于List长度或者小于0,抛出异常        if (index > size || index < 0)            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));    }

第三个方法是添加一个集合

public boolean addAll(Collection
c) { //转换为数组 Object[] a = c.toArray(); int numNew = a.length; //确保数组长度足够存储 ensureCapacityInternal(size + numNew); //直接将转换后的数组从索引0开始复制 //复制到elementData,从size开始复制 //复制长度为a的长度,即集合长度 System.arraycopy(a, 0, elementData, size, numNew); //list长度增加 size += numNew; //如果要添加的集合长度为0,添加失败,即没添加 return numNew != 0; }

第四个方法是在指定的位置添加一个集合,在指定的位置添加一个集合,则至少要对数组进行两次的复制,第一次移动元素,一遍有足够的空间添加集合,第二次才是添加集合,并且都是用System.arrayCopy()进行数组的处理。

public boolean addAll(int index, Collection
c) { //也要检查索引是否越界 rangeCheckForAdd(index); //转换为数组 Object[] a = c.toArray(); int numNew = a.length; //确保数组长度足够 ensureCapacityInternal(size + numNew); //要移动的元素个数 int numMoved = size - index; if (numMoved > 0) //移动元素 System.arraycopy(elementData, index, elementData, index + numNew, numMoved); //添加集合 System.arraycopy(a, 0, elementData, index, numNew); //长度增加 size += numNew; return numNew != 0; }

后续我们自己实现一个自己的List。

转载于:https://my.oschina.net/jettyWang/blog/909877

你可能感兴趣的文章
Could not find artifact com.sun:tools:jar:1.5.0 解决办法
查看>>
phpstorm xdebug remote配置
查看>>
引用与指针的区别
查看>>
pygtk笔记--2.1:布局容器,VBox、Hbox、Alignment
查看>>
dtree.js树的使用
查看>>
Springboot2.1.3 + redis 实现 cache序列化乱码问题
查看>>
线程什么时候需要同步,什么时候不需要同步?
查看>>
Struts2 自定义拦截器(方法拦截器)
查看>>
Linux服务器的那些性能参数指标
查看>>
BZOJ 2302: [HAOI2011]Problem c [DP 组合计数]
查看>>
c++ 11开始语言本身和标准库支持并发编程
查看>>
.NET Core 之 MSBuild 介绍
查看>>
iOS:即时通讯之<了解篇 SocKet>
查看>>
@EnableTransactionManagement注解理解
查看>>
《JavaScript高级程序设计》读书笔记(十):本地对象Date
查看>>
linux中fork()函数详解
查看>>
从1G到5G,46年屏幕变迁下,富士康、苹果、三星、华为的浴火重生路 ...
查看>>
##II 第四单元##管理系统中的简单分区和文件系统
查看>>
用flash测试你的ircd
查看>>
白话红黑树系列之二——红黑树的构建
查看>>