zoukankan      html  css  js  c++  java
  • ArrayList的sublist

    ArrayList的方法subList() 分割集合的一段出来使用

    demo

    List<String> sourceList = new ArrayList<>();
    sourceList.add("11");
    sourceList.add("22");
    sourceList.add("33");
    List<String> subList = sourceList.subList(0, 1);

    subList 即包含了元素 "11"

    1、对父(sourceList)子(subList)List做的非结构性修改(non-structural changes),都会影响到彼此。
    如sourceList或者subList调用set()方法修改某个元素,那么父和子集合都会一起改变

    如 subList.set(0,"00"); 那么 sourceList 和 subList 索引0的地方元素都为"00"

    2、对子List(subList)做结构性修改,操作同样会反映到父List(sourceList)上。
    如删除元素(remove),增加(add)元素等都会反映到父List上,父List也会被修改

    subList.add("44"); 那么 sourceList 和 subList 索引4的地方元素都为"44"


    3、对父List(sourceList)做结构性修改,会抛出异常ConcurrentModificationException
    如删除元素(remove),增加(add)元素等都会引起并发异常

    sourceList.add("55"); 抛出异常  ConcurrentModificationException

        本质上看,SubList并没有重新创建一个List,而是直接引用了原有的List(返回了父类的视图),
    只是指定了一下他要使用的元素的范围而已(从fromIndex(包含),到toIndex(不包含))。

    ArrayList底层是实现是数组,sourceList 和 subList都是引用了sourceList内的底层数组,
    所以当集合内数据发生改变,都一起改变。


    阿里开发手册规定
    1 ArrayList的subList结果不可强转成ArrayList,否则会抛出ClassCastException异常

        解释

    此处 List<String> subList = sourceList.subList(0,1);
    subList的类型,不是ArrayList的父类那个List
    而是ArrayList的内部类,所以subList和ArrayList无继承关系,无法转换


    阿里开发手册规定
    2 在subList场景中,高度注意对原集合元素个数的修改,会导致子列表的遍历、增加、删除
    均产生ConcurrentModificationException 异常

  • 相关阅读:
    Hibernate4
    Hibernate3 多对多关系
    Hibernate 二(一级缓存,多表设计之一对多)
    Hibernate 配置文件
    Hibernate 基础解析(Configuration,SessionFactory,Session,Transaction,Query,Criteria)
    struts2 防止表单的重复提交
    struts2 UI标签 和 主题
    struts2 OGNL配和通用标签和其它标签的使用
    struts2 对EL的改变
    struts2 contextMap
  • 原文地址:https://www.cnblogs.com/hup666/p/11914073.html
Copyright © 2011-2022 走看看