ArrayList中remove方法和set(null)的区别
在分析源码ArrayList.remove()时,偶然发现了一个疑惑的点,就是:源码也是将最后一个对象的引用指向null(源码:elementData[--size] = null; // clear to let GC do its work),而使用 list.set(最大下标,null)同样也是将对象的引用指向null,为什么输出的结果为:remove()方法 对应位置的值会被“删除”,set()方法 下标位置的值依然被保留、输出。这是为什么呢?
首先我们先看一下remove()方法的源码,这里只讲通过下标删除。
/**
* Removes the element at the specified position in this list.
* Shifts any subsequent elements to the left (subtracts one from their
* indices).
*
* @param index the index of the element to be removed
* @return the element that was removed from the list
* @throws IndexOutOfBoundsException {@inheritDoc}
*/
public E remove(int index) {
// 检查下标是否越界
rangeCheck(index); // 记录修改次数,这里就是foreach、Iterator遍历时不能执行删除的根本原因
modCount++;
E oldValue = elementData(index); int numMoved = size - index - ;
if (numMoved > )
// 系统内置的数据复制,浅复制。什么是浅复制这里就不做扩展了
System.arraycopy(elementData, index+, elementData, index,
numMoved); // 重点来了,本次探讨的问题
elementData[--size] = null; // clear to let GC do its work return oldValue;
}
这里我准备了一个事例用来分析,如下:
@Test
public void Test1() {
String[] array = {"","","","",""};
List<String> setList = new ArrayList<>(Arrays.asList(array));
List<String> removeList = new ArrayList<>(setList); setList.set(, null);
removeList.remove(); System.out.println(setList);
System.out.println(removeList);
}
输入结果:

通过分析查找资料,终于发现了问题出在哪了,原来源码中的 --size 就是造成两种结果的原因,下面给出解析:
1:首先要明白一个道理,数据存储在内存中是连续的。
其次,集合在 AbstractCollection 重写了toString方法,可以看到 arrayList 是通过迭代器遍历输出的。

2:ArrayList实现了 iterator() 方法,返回一个实现 Iterator<E> 的内部类 Itr ,其中 hasNext() 方法 决定了只返回size大小的数据,而size 正是arrayList的大小。

现在,知道为什么输出的结果会是上面看到的样子了吧。其实,上面两种方式生成的数组,存储在内存中是一样的,都是最后一个对象的引用指向null,只是 remove()方法 改变了记录数组的size大小。
ArrayList中remove方法和set(null)的区别的更多相关文章
- ExtJS中listener方法和handler方法的区别
listener方法和handler方法的区别在文档中的说明的太玄乎了,看不懂 listeners监听能够对一个click Event事件添加任意多个的事件响应处理函数 而handler处理只能够通过 ...
- java中equals方法和hashcode方法的区别和联系,以及为什么要重写这两个方法,不重写会怎样
一.在Object类中的定义为:public native int hashCode();是一个本地方法,返回的对象的地址值.但是,同样的思路,在String等封装类中对此方法进行了重写.方法调用得到 ...
- jquery中attr方法和prop方法的区别
关于checked的属性,最重要的概念就是你要记住,它跟checked的状态值是毫无关系的,设置checked = "checked"或者checked = "true& ...
- Thinkphp中D方法和M方法的区别
两者共同点都是实例化模型的,而两者不同点呢?一起来看一下: $User = D('User');括号中的参数User,对应的模型类文件的 \Home\Model\UserModel.class.php ...
- Hibernate中get方法和load方法的区别
一.get和load方法都是根据id去获得对应数据的,但是获得机制不同:如果使用get方法,hibernate会去确认该id对应的数据是否存在,它首先会去session中去查询(session缓存其实 ...
- commons lang3的StringUtils中isEmpty()方法和isBlank()方法的区别
先给结论: 1. StringUtils.isEmpty()中的空格作非空处理2. StringUtils.isNotEmpty()是StringUtils.isEmpty()取反后的结果3. Str ...
- jquery中prop()方法和attr()方法的区别浅析
官方例举的例子感觉和attr()差不多,也不知道有什么区别,既然有了prop()这个新方法,不可能没用吧,那什么时候该用attr(),什么时候该用prop()呢 jquery1.6中新加了一个方法pr ...
- jquery中prop()方法和attr()方法的区别
最近在用jquery的时候遇到一个问题,那就是attr()方法,发现这个方法有时候使用会有一些说不出原因的问题.翻翻自己之前笔记发现,还有个函数prop(). 这两个函数都可以用来获取属性. jque ...
- jquery中prop()方法和attr()方法的区别(转)
jquery1.6中新加了一个方法prop(),一直没用过它,官方解释只有一句话:获取在匹配的元素集中的第一个元素的属性值. 官方例举的例子感觉和attr()差不多,也不知道有什么区别,既然有了pro ...
随机推荐
- 洛谷 P1948 [USACO08JAN]电话线Telephone Lines 最短路+二分答案
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 题面 题目链接 P1948 [USACO08JAN]电话线Telephone ...
- 阿里云linux服务器到期后续费,网站打不开解决方法之一
续费后打不开网站,可能会出现不同情况,这里只记录我遇到的问题 问题描述:服务器到期后续费,网站打不开. 解决尝试: 1.重启服务器nginx /etc/init.d/nginx restart ...
- vs dump调试
1. dump文件和pdb文件的匹配问题 >> 发布二进制文件时生成的pdb文件一定要保留,只有当发布的二进制文件和pdb文件是同时生成的才好正确调试. 2. dump文件和pdb文件放在 ...
- JavaScript--对象继承(组合继承)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- oracle-Immediate
从shutdown immediate命令发布起,禁止建立任何新的oracle连接 未提交的事务被回退.因此,处于一个事务中间的用户将失去所有未提交的劳动成果. oracle不等待客户断开连接.任何未 ...
- 洛谷1014 Cantor表
水题.随便搞搞就过了. //Serene #include<algorithm> #include<iostream> #include<cstring> #i ...
- app被Rejected 的各种原因翻译。这个绝对有用
1. Terms and conditions(法律与条款) 1.1 As a developer of applications for the App Store you are bound b ...
- List容器-LinkedList链表
LinkedList--链表 特点: 删除,增加 用LinkedList性能高 层次查找不适合 查询用ArrayList 数组下标查找 插入和删除慢缺点是要做移位操作 总结:Link ...
- ssh 出错 Permission denied (publickey,password).
将客户端的~/.ssh/know_hosts 文件删掉试试 ssh debug信息 ssh -vvv xxx@192.168.1.111
- j2se--异常机制
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/quwenzhe/article/details/35610853 java异常机制中主要包含一个 ...