zoukankan      html  css  js  c++  java
  • 子列表只是原列表的一个视图

    原文参考:《编写高质量代码:改善java程序的151个建议》

    本文原创:穆雄雄

    上期文章:

    subList?? subString???

    上期我们说到,List接口提供了subList方法,其作用是返回一个列表的子列表。并且我们通过案例说明了一个问题,那便是,在原来的list集合基础上,调用subList产生新的List的时候,那么原来的list集合也会随之而改。

    在看为什么之前,我们还是先从subList的源码上说起吧。

    public List<E> subList(int fromIndex, int toIndex) {
    
      return (this instanceof RandomAccess ?
    
      new RandomAccessSubList<E>(this, fromIndex, toIndex) :
    
      new SubList<E>(this, fromIndex, toIndex));
    
    }
    

    从代码中我们可以看到,instanceof的作用就是查看当前的对象是否是RandomAccess的实例,如果是,则调用RandomAccessSubList方法,否则调用SubList方法,况且进一步查看源码可以得知RandomAccessSubList类也继承至SubList类,所以我们直接来看SubList的源码:

    class SubList<E> extends AbstractList<E> {
    
      private final AbstractList<E> l;
    
      private final int offset;
    
      private int size;
    
    
    
      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;
    
        this.modCount = l.modCount;
    
      }
    
    }
    //后面省略其他方法
    

    通过阅读这段代码,我们就很清楚的知道SubList方法的实现原理,它返回的SubList类也是AbstractList的子类,其所有的方法如get、set、add、remove等都是在原始列表上的操作,它自身并没有生成一个数组或是链表,也就是子列表只是原列表的一个视图(View),所有的修改动作都反映在了原列表上。

    所以我们表面上操作的是newList,其实操作的还是原来的列表。subList产生的列表只是一个视图,所有的修改动作直接作用于源列表。

    往期精彩

    “半路出家”的程序猿怎么不被“熊”

    2020-10-11

    某同学工作之后的感悟

    2020-10-10

    班级日常分享,一天一瞬间

    2020-10-10

    为了金秋那沉甸甸的麦穗,我绝不辜负春天

    2020-10-09

    subList?? subString???

    2020-10-08

    "爸妈没多大本事"……

    2020-10-07

    点分享

    点点赞

    点在看

  • 相关阅读:
    Git-远程版本库
    Git-Git分支
    Git-Git里程碑
    Git-冲突解决
    Git-Git库管理
    Git-Git克隆
    Git-改变历史
    Git-历史穿梭
    RHCE考试
    RHCSA考试
  • 原文地址:https://www.cnblogs.com/a1111/p/14877391.html
Copyright © 2011-2022 走看看