在分析源码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 - 1;if (numMoved > 0)// 系统内置的数据复制,浅复制。什么是浅复制这里就不做扩展了System.arraycopy(elementData, index+1, elementData, index,numMoved);// 重点来了,本次探讨的问题elementData[--size] = null; // clear to let GC do its workreturn oldValue;}

  这里我准备了一个事例用来分析,如下:

    @Testpublic void Test1() {String[] array = {"1111","2222","3333","4444","5555"};List<String> setList = new ArrayList<>(Arrays.asList(array));List<String> removeList = new ArrayList<>(setList);setList.set(4, null);removeList.remove(4);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大小。

转载于:https://www.cnblogs.com/pan1042/p/11271118.html

ArrayList中remove方法和set(null)的区别相关推荐

  1. python predict_对Keras中predict()方法和predict_classes()方法的区别说明

    1 predict()方法 当使用predict()方法进行预测时,返回值是数值,表示样本属于每一个类别的概率,我们可以使用numpy.argmax()方法找到样本以最大概率所属的类别作为样本的预测标 ...

  2. java——Scanner中nextLine()方法和next()方法的区别

    遇到一个有意思的东西,在整理字符串这块知识的时候,发现我在用Scanner函数时,在字符串中加入空格,结果空格后面的东西没有输出来(/尴尬),不多说直接上代码: import java.util.Sc ...

  3. ExtJS中listener方法和handler方法的区别

    listener方法和handler方法的区别在文档中的说明的太玄乎了,看不懂 listeners监听能够对一个click Event事件添加任意多个的事件响应处理函数 而handler处理只能够通过 ...

  4. Keras中predict()方法和predict_classes()方法的区别

    正如上篇博客中所讲,在Keras框架下执行深度学习任务时,一般会先根据训练数据集训练出模型,然后拿训练好的模型到生产环境(测试集)中部署并生产.以分类问题为例,当训练好了分类模型之后,我们要用这个模型 ...

  5. VBA中Activate方法和Select方法的区别

    VBA中的Activate方法和Select方法看起来似乎相同,其实二者是有区别的.Activate方法的作用是激活,而Select方法的作用是选择.其区别如下: 1.对于"Sheets&q ...

  6. Hibernate中get方法和load方法的区别

    一.get和load方法都是根据id去获得对应数据的,但是获得机制不同:如果使用get方法,hibernate会去确认该id对应的数据是否存在,它首先会去session中去查询(session缓存其实 ...

  7. List集合中add()方法和addAll()方法的区别

    Add方法是将传入的参数作为当前List中的一个item存储,即使你传入一个List也只会令当前的List增加1个元素 AddAll是传入一个List,将此List中的所有元素加入到当前List中,也 ...

  8. Java类型转换中valueOf方法和parseInt方法的区别

    在Java的类型转换中,我们经常会使用valueOf或者parseInt(parseFloat/parseDouble等)来转换.这二者有什么区别呢?我们看如下的代码: String inputVal ...

  9. jQuery中find()方法和filter()方法的区别

    jQuery官方的API这样说明filter和find函数: filter(selector):Description: Reduce the set of matched elements to t ...

最新文章

  1. 两个免费转换视频的软件,实现服务器端Video2FLV
  2. 腾讯安全携手华夏银行“论道”金融风控,传递在线反欺诈干货建议
  3. 多个if和一个ifelse的区别
  4. Mathematic Paradigm
  5. 使用 GO-CQHttp或mirai框架 搭建QQ的机器人
  6. 关于python函数参数的描述中、错误的是_在Python中,以下关于函数的描述错误的是哪一项?...
  7. 微信中那些你不知道的隐藏实用功能!
  8. 致远OA漏洞学习——A6版本test.jsp 文件上传
  9. 微信每日早安推送,快来给你女友做爱心提醒吧,自定义推送名称,企业号通知非订阅号测试号,后台python,精简无第三方网站注册、无第三方接口,无基础快速上不了手
  10. 关于神经网络的轻量化
  11. 双粗虚线中间一条实线_马路上实线两边有很粗的虚线(中间实线或虚线两边还有很粗的虚线是啥意思)...
  12. 【WINDOWS / DOS 批处理】if命令实现逻辑运算符
  13. 理解PBR:从原理到实现(上)
  14. C++:实现量化GSR模型测试实例
  15. 如何调用百度卫星地图
  16. CTF~ImageMagick+gaps=自动拼图
  17. Spring(二) -- 春风拂面之 核心 AOP
  18. 红米k30s至尊纪念版和华为p30pro哪个好
  19. c4d python 插件_【影视后期必知干货!C4D插件的安装及类型合集】- 环球网校
  20. 女孩子,不漂亮也没关系

热门文章

  1. 利用redis实现分布式请求防重复提交
  2. Linux初学 - SSH
  3. 使用SHA256证书进行微软数字签名代码签名
  4. 【Android开发日记】第一个任务Android Service!Service靴+重力感应器+弹出窗口+保持执行...
  5. Object C学习笔记22-#define 用法
  6. 修改网络MAC地址的技巧
  7. java实现选择排序
  8. ACS AD 和本地验证SSL ×××
  9. Coolite Toolkit学习笔记九:表单布局控件FormLayout与FromPanel
  10. 安装MYSQL出现checking for termcap functions library