http://blog.csdn.net/sbfivwsll/article/details/6557611

java List.subList方法中的超级大陷阱

在使用集合中,可能常常需要取集合中的某一部分子集来进行一下操作,于是subList这个方法就映入我们的眼帘,毫不犹豫地使用。

例如以下代码:

public static void main(final String[] args) {

List lists = new ArrayList();

lists.add("1");

lists.add("2");

lists.add("3");

lists.add("4");

List 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 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) {

List lists = new ArrayList();

lists.add("1");

lists.add("2");

lists.add("3");

lists.add("4");

//注意这里是和本文顶部的代码不同的....

List tempList = new ArrayList(lists.subList(2, lists.size()));

tempList.add("6");

System.out.println(tempList); // 1

System.out.println(lists); // 2

}

分享到:

2011-08-29 12:46

浏览 25211

评论

3 楼

bestu

2012-03-13

2 楼

bestu

2012-03-13

1 楼

bestu

2012-03-13

subList(2, lists.

java sublist_java 中sublist的使用相关推荐

  1. java sublist_java中的subList

    package test; import java.util.ArrayList; import java.util.List; //对parentList进行结构性修改,访问subList会抛出异常 ...

  2. java sublist_java中List.subList()方法的使用

    sublist返回的东西,官方解释:Returns a view of the portion of this list between the specified fromIndex, inclus ...

  3. java sublist_Java Vector subList()方法与示例

    java sublist 向量类subList()方法 (Vector Class subList() method) subList() method is available in java.ut ...

  4. java sublist_java 中List.subList 总结

    今天,维护以前的代码,看到了List.subList这个方法,以前没接触过,对这个就是个小白,今天学习下: java.util.List中有一个subList方法,用来返回一个list的一部分的视图. ...

  5. java sublist_Java中List的subList()方法的使用陷阱

    如果没有看过List或者两个常用的实现类ArrayList.LinkedList的subList()方法的源码,而只是通过API文档,那么很多朋友很容易调入一个陷阱.或者有些朋友根据String的su ...

  6. java sublist_java中利用List的subList方法实现对List分页(简单易学)

    /** *//** * List分页 * 实现:利用List的获取子List方法,实现对List的分页 * @author 显武 * @date 2010-1-8 16:27:31 * */ impo ...

  7. java ArrayList中的subList方法

    2019独角兽企业重金招聘Python工程师标准>>> 本文是本人的学习笔记,把自己的理解总结记录下来.因本人水平有限,如果您在阅读中发现错误,还望谅解,并且希望能够告知本人改正,不 ...

  8. 【Java心得总结六】Java容器中——Collection

    在[Java心得总结五]Java容器上--容器初探这篇博文中,我对Java容器类库从一个整体的偏向于宏观的角度初步认识了Java容器类库.而在这篇博文中,我想着重对容器类库中的Collection容器 ...

  9. java util 中set,List 和Map的使用

    Set对每个对象只接受一次,并使用自己内部的排序方法(通常,你只关心某个元素是否属于Set,而不关心它的顺序--否则应该使用List).Map同样对每个元素保存一份,但这是基于"键" ...

最新文章

  1. 2017.07.05 第五组 NABCD+用户原型+用户调研
  2. 如何在Jsp上传图片
  3. 中间的数(若已经排好序)
  4. vue 加载太慢_Vue首页加载过慢 解决方案
  5. 深挖android low memory killer
  6. 买的首套房开发商指定的银行是5.88的利率,朋友都说利率有点高,怎样才能省点钱呢?
  7. Amazon behavior question
  8. UITextField-IOS开发
  9. SoapUI被动接口的压力测试/性能测试
  10. 豪越智慧后勤解决方案(教育/高校)
  11. 【SPSS】SPSS学习笔记
  12. springboot 设置全局字符编码,解决乱码问题
  13. 计算机台式硬件排名,台式机主板什么牌子好?台式电脑主板品牌排行榜前十名(2)...
  14. 使用 opencv 画 五角星
  15. 我对平均值,期望,大数定律之间的联系的理解
  16. PHP Fatal error: Call to undefined function Controller\\mb_strtoupper()
  17. 治愈系英语笔记-2-一般、否定疑问句,现表将来
  18. 查找java最耗费CPU线程的命令
  19. eclipse如何用Debug调试程序
  20. POI2014 Salad Bar

热门文章

  1. Unity中基于屏幕后处理的彩色与黑白渐变效果
  2. 安装GIT服务器 gitolite,及权限管理
  3. 怎么实现两周联动加减速_跑跑卡丁车手游虎王怎么样新道具车虎王购买建议
  4. Object强制转换问题
  5. iOS-isa指针;objc实例对象、类、元类、根类、根元类
  6. 第八课 决策树和随机森林
  7. 题目 1106: 奖学金
  8. steam游戏搬砖,长期稳定的副业,限时免费开课,详细操作拆解
  9. html中数值如何自动取整,excel四舍五入取整函数
  10. 1507四舍五入c语言,Excel工作表中的“四舍五入”都不掌握,还敢称Excel达人?