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方法中的超级大陷阱相关推荐

  1. Java SubList 类 Java subList方法 Java ArrayList$SubList 方法特点 SubList 用法

    Java SubList 类 Java subList方法 Java ArrayList$SubList 方法特点 SubList 用法 一.概述 在java集合中,常用ArrayList类中,若需要 ...

  2. 在JAVA语言程序中main_在Java程序main方法中,正确的参数是

    [单选题]下列叙述中,错误的是 [填空题]Access属于()数据库,Access中,不允许在主关键字字段中有重复值或(). [单选题]如下哪些字符串是Java中的标识符? [填空题]常用的基本电量传 ...

  3. 在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’;输出这个数组中的所有元素。...

    //在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是'*',其余 位置存的是'#':输出这个数组中的所有元素.char [][]y=new char [10][10] ...

  4. 盘点Java技术在生活中的10大应用

    没有见过用Java编写的游戏.桌面系统.办公软件?如果你是一个初学者或者只是刚刚开始学习Java,你或许会疑虑,Java到底是在哪里被运用了呢?如何正确的在现实世界中运用Java? 当你在安装Java ...

  5. 盘点Java技术在生活中的10大应用!

    没有见过用Java编写的游戏.桌面系统.办公软件?如果你是一个初学者或者只是刚刚开始学习Java,你或许会疑虑,Java到底是在哪里被运用了呢?如何正确的在现实世界中运用Java?当你在安装Java在 ...

  6. java list sublist方法_(转)Java 中 List.subList() 方法的使用陷阱

    原文:http://blog.csdn.net/cleverGump/article/details/51105235 前言 本文原先发表在我的 iteye博客: http://clevergump. ...

  7. java list sublist方法_聊聊ArrayList中的subList方法

    开发过程中遇到的坑 开发过程经常会使用subList做分页处理. 比如下面的代码 while(pageIndex < maxSize) { List temp = userIds.subList ...

  8. java 在主方法中定义两个变量 调用方法进行加10_计算机考试二级考试Java模拟试题附答案...

    全国计算机等级考试二级考试,需要考生在考前做好足够的复习准备,下面小编为大家带来计算机考试二级考试Java模拟试题,供各位考生练习! 计算机考试二级考试Java模拟试题一 1.类Test1定义如下:p ...

  9. java百分号的用法,Java String.format()方法中使用百分号'%'_栗子教程

    下面这个例子演示了如何在String.format方法中显示一个百分号. 像下面这样直接调用String.format("%d%", 100)来显示百分号,将会抛出java.uti ...

最新文章

  1. 云服务器 与本地文件传输,云服务器 与本地文件传输
  2. 数据库(Mysql)背后的数据结构-学习
  3. GRpc-Go使用笔记
  4. 模板方法模式(Template Method Pattern)学习笔记
  5. C++学习之路 | PTA(天梯赛)—— L2-010 排座位 (25分)(带注释)(并查集)(精简)
  6. 被“薅羊毛”损失200多万!元气森林:系运营事故
  7. 程序员都应该知道的 10 大算法
  8. 【caffe】Caffe的Python接口-官方教程-01-learning-Lenet-详细说明(含代码)
  9. mysql存储过程的一个小例子
  10. 20140708testC
  11. 想要学习C++,就必须要学习C语言吗?
  12. linux下shell检测sd卡分区表,shell中给sd卡或u盘分区
  13. Python正则表达式(网址正则/超链接正则)
  14. LOJ#2863. 「IOI2018」组合动作 交互
  15. python解决数学问题
  16. html5新增属性cookies,关于cookie的SameSite属性
  17. 什么是VPS云服务器?
  18. 计算机速成课 第三集 布尔逻辑和逻辑门
  19. Web安全 -- 信息收集(上)
  20. 《小学生四则运算出题软件》结对项目总结

热门文章

  1. HyperWorks在汽车与行人腿部碰撞仿真中的应用
  2. 使用dot语言画树结构
  3. ミュルス / 魔兽娘
  4. python3正则表达式\w可以匹配中文字符
  5. 什么是负一屏,场景识别
  6. 玩转Android10源码开发定制(八)内置Apk到系统
  7. android relativelayout 垂直居中,RelativeLayout 子组件 垂直居中,水平居中方法
  8. 最优化学习 KKT条件(最优解的一阶必要条件)
  9. tp 双击唤醒 最终实现方案 参考
  10. finelybook