java.util.List.subList() 使用注意事项

1 篇文章 0 订阅
1 篇文章 0 订阅

java.util.List.subList() 使用注意事项

标签:Java List.SubList


subList
List subList(int fromIndex, int toIndex)
  返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图。(如果 fromIndex 和 toIndex 相等,则返回的列表为空)。
  返回的列表由此列表(原列表)支持,所以,你对原来的list和返回的list做的“非结构性修改”(non-structural changes),都会影响到彼此对方
  返回的列表(子列表)支持此列表(原列表)支持的所有可选列表操作。

  此方法省去了显式范围操作(此操作通常针对数组存在)。通过传递 subList 视图而非整个列表,期望列表的任何操作可用作范围操作。

  **例如,下面的语句从列表中移除了元素的范围:
  list.subList(from, to).clear();**

  可以对 indexOf 和 lastIndexOf 构造类似的语句,而且 Collections 类中的所有算法都可以应用于 subList。

  如果支持列表(即此列表)通过任何其他方式(而不是通过返回的列表)从结构上修改,则此方法返回的列表语义将变为未定义(从结构上修改是指更改列表的大小,或者以其他方式打乱列表,使正在进行的迭代产生错误的结果)。

参数:
  fromIndex - subList 的低端(包括)
  toIndex - subList 的高端(不包括)
返回:
  列表中指定范围的视图
抛出:
  IndexOutOfBoundsException - 非法的端点值 ( fromIndex < 0 || toIndex > size || fromIndex > toIndex)

示例代码:

@Test
public void testSubList() {
  List<String> originalList = new ArrayList<String>();

  for(int i = 0; i < 5; i++){
    originalList.add(String.valueOf(i));
  }

  List<String> subList = originalList.subList(2, 4);
  for(String s : subList){
    System.out.println(s);
    //输出: 2, 3
  }
  System.out.println("-----");

  //非结构性的修改子列表subList,将会影响到原列表originalList 一同修改
  subList.set(0, "22");
  for(String s : originalList){
    System.out.println(s);
    //输出: 0, 1, 22, 3, 4
  }
  System.out.println("-----");

  //structural modification by sublist, reflect parentList
  subList.add(String.valueOf(2.5));
  for(String s : originalList){
    System.out.println(s);
    //output:0, 1, 22, ,3, 2.5, 4
  }
  System.out.println("-----");

  //non-structural modification by parentList, reflect sublist
  originalList.set(3, "33");
  for(String s : subList){
    System.out.println(s);
    //output: 22, 33, 2.5
  }
  System.out.println("-----");

  //structural modification by parentList, sublist becomes undefined(throw exception)
  originalList.add("6");
  // for(String s : subList){
    // System.out.println(s);
  // }
  subList.get(0);
}

注:最后注释的for循环以及get(0) 都会抛出异常:

java.util.ConcurrentModificationException
  at java.util.ArrayList$SubList.checkForComodification(ArrayList.java:1231)
  at java.util.ArrayList$SubList.get(ArrayList.java:1035)
  at com.youai.user.test.TestJava.testSubList(TestJava.java:65)
  ...
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值