java List.subList方法中的超级大陷阱
java List.subList方法中的超级大陷阱
2012-06-26 10:13:18| 分类: java 基础知识 | 标签:java集合使用 java基础 |举报|字号 订阅
下载LOFTER 我的照片书 |
ArrayList 中 subList 的基本用法:
subList(fromIndex:int,toIndex:int):List<E> | 返回从fromIndex到toindex-1 的 子列表 |
在使用集合中,可能常常需要取集合中的某一部分子集来进行一下操作,于是subList这个方法就映入我们的眼帘,毫不犹豫地使用。
例如以下代码:
public static void main(final String[] args) { List<Object> lists = new ArrayList<Object>(); lists.add("1"); lists.add("2"); lists.add("3"); lists.add("4"); List<Object> tempList = lists.subList(2, lists.size()); tempList.add("6"); System.out.println(tempList); // 1 System.out.println(lists); // 2 }
代码初步写好后,可能我们想达到的效果是:往集合lists的子集合tempList中添加一个元素6,而原有的集合保持不变。
即到达这样的效果:lists = [1, 2, 3, 4],tempList = [3, 4, 6]。但是我们看到实际的结果确是lists里边也添加了元素6。
这是怎么一会事呢,通过查找java原代码我们可以看到:tempList的subList实现代码在AbstractList类里边,然而无论如何,最终的结果都是返回一个AbstractList的子类:SubList(该类是一个使用默认修饰符修饰的类,其源代码位于AbstractList.java类文件里边),
SubList类的构造方法:
SubList(AbstractList<E> list, int fromIndex, int toIndex) { if (fromIndex < 0) throw new IndexOutOfBoundsException("fromIndex = " + fromIndex); if (toIndex > list.size()) throw new IndexOutOfBoundsException("toIndex = " + toIndex); if (fromIndex > toIndex) throw new IllegalArgumentException("fromIndex(" + fromIndex + ") > toIndex(" + toIndex + ")"); l = list; offset = fromIndex; size = toIndex - fromIndex; expectedModCount = l.modCount; }
里边,将我们原有的list对象给缓存到SubList类对象的一个属性中去了。
而SubList类的add/remove等修改元素的方法中,都使用l进行了操作:
public void add(int index, E element) { if (index<0 || index>size) throw new IndexOutOfBoundsException(); checkForComodification(); l.add(index+offset, element); expectedModCount = l.modCount; size++; modCount++; }
因此,当我们使用子集合tempList进行元素的修改操作时,会影响原有的list集合。所以在使用subList方法时,一定要想清楚,是否需要对子集合进行修改元素而不影响原有的list集合。
如果需要对子集合的元素进行修改操作而不需要影响原集合时,我们可以使用以下方法进行处理:
public static void main(final String[] args) public static void main(final String[] args) { List<Object> lists = new ArrayList<Object>(); lists.add("1"); lists.add("2"); lists.add("3"); lists.add("4"); //注意这里是和本文顶部的代码不同的.... List<Object> tempList = new ArrayList<Object>(lists.subList(2, lists.size())); tempList.add("6"); System.out.println(tempList); // 1 System.out.println(lists); // 2 }
java List.subList方法中的超级大陷阱相关推荐
- Java SubList 类 Java subList方法 Java ArrayList$SubList 方法特点 SubList 用法
Java SubList 类 Java subList方法 Java ArrayList$SubList 方法特点 SubList 用法 一.概述 在java集合中,常用ArrayList类中,若需要 ...
- 在JAVA语言程序中main_在Java程序main方法中,正确的参数是
[单选题]下列叙述中,错误的是 [填空题]Access属于()数据库,Access中,不允许在主关键字字段中有重复值或(). [单选题]如下哪些字符串是Java中的标识符? [填空题]常用的基本电量传 ...
- 在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’;输出这个数组中的所有元素。...
//在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是'*',其余 位置存的是'#':输出这个数组中的所有元素.char [][]y=new char [10][10] ...
- 盘点Java技术在生活中的10大应用
没有见过用Java编写的游戏.桌面系统.办公软件?如果你是一个初学者或者只是刚刚开始学习Java,你或许会疑虑,Java到底是在哪里被运用了呢?如何正确的在现实世界中运用Java? 当你在安装Java ...
- 盘点Java技术在生活中的10大应用!
没有见过用Java编写的游戏.桌面系统.办公软件?如果你是一个初学者或者只是刚刚开始学习Java,你或许会疑虑,Java到底是在哪里被运用了呢?如何正确的在现实世界中运用Java?当你在安装Java在 ...
- java list sublist方法_(转)Java 中 List.subList() 方法的使用陷阱
原文:http://blog.csdn.net/cleverGump/article/details/51105235 前言 本文原先发表在我的 iteye博客: http://clevergump. ...
- java list sublist方法_聊聊ArrayList中的subList方法
开发过程中遇到的坑 开发过程经常会使用subList做分页处理. 比如下面的代码 while(pageIndex < maxSize) { List temp = userIds.subList ...
- java 在主方法中定义两个变量 调用方法进行加10_计算机考试二级考试Java模拟试题附答案...
全国计算机等级考试二级考试,需要考生在考前做好足够的复习准备,下面小编为大家带来计算机考试二级考试Java模拟试题,供各位考生练习! 计算机考试二级考试Java模拟试题一 1.类Test1定义如下:p ...
- java百分号的用法,Java String.format()方法中使用百分号'%'_栗子教程
下面这个例子演示了如何在String.format方法中显示一个百分号. 像下面这样直接调用String.format("%d%", 100)来显示百分号,将会抛出java.uti ...
最新文章
- 云服务器 与本地文件传输,云服务器 与本地文件传输
- 数据库(Mysql)背后的数据结构-学习
- GRpc-Go使用笔记
- 模板方法模式(Template Method Pattern)学习笔记
- C++学习之路 | PTA(天梯赛)—— L2-010 排座位 (25分)(带注释)(并查集)(精简)
- 被“薅羊毛”损失200多万!元气森林:系运营事故
- 程序员都应该知道的 10 大算法
- 【caffe】Caffe的Python接口-官方教程-01-learning-Lenet-详细说明(含代码)
- mysql存储过程的一个小例子
- 20140708testC
- 想要学习C++,就必须要学习C语言吗?
- linux下shell检测sd卡分区表,shell中给sd卡或u盘分区
- Python正则表达式(网址正则/超链接正则)
- LOJ#2863. 「IOI2018」组合动作 交互
- python解决数学问题
- html5新增属性cookies,关于cookie的SameSite属性
- 什么是VPS云服务器?
- 计算机速成课 第三集 布尔逻辑和逻辑门
- Web安全 -- 信息收集(上)
- 《小学生四则运算出题软件》结对项目总结