ArrayList实现中的SubList
2017-08-02 22:32
239 查看
最近在看JDK源码,看到ArrayList.java这个实现的时候,发现里面有一个SubList子类,这个类里是直接操作父类元素的,所以会对父类产生影响,可能以后会用错,在这里记下来。
源码里面,ArrayList类中有下面这么个方法可以获取到ArrayList的一个子列表
源码里面,ArrayList类中有下面这么个方法可以获取到ArrayList的一个子列表
public List<E> subList(int fromIndex, int toIndex) { subListRangeCheck(fromIndex, toIndex, size); return new SubList(this, 0, fromIndex, toIndex); }
返回的SubList是ArrayList的一个子类,源码片段如下:
...
private class SubList extends AbstractList<E> implements RandomAccess { private final AbstractList<E> parent; private final int parentOffset; private final int offset; int size; SubList(AbstractList<E> parent, int offset, int fromIndex, int toIndex) { this.parent = parent; this.parentOffset = fromIndex; this.offset = offset + fromIndex; this.size = toIndex - fromIndex; this.modCount = ArrayList.this.modCount; }
...
可以看到这个子类继承了AbstractList所以其实它也是一个List类型,但是它里面的操作都是针对父List的,源码里面是这么写的:
...
public void add(int index, E e) { rangeCheckForAdd(index); checkForComodification(); parent.add(parentOffset + index, e); this.modCount = parent.modCount; this.size++; } public E remove(int index) { rangeCheck(index); checkForComodification(); E result = parent.remove(parentOffset + index); this.modCount = parent.modCount; this.size--; return result; }
...
上面的操作都是直接调用了父List的方法,只不过对应的offset不一样,所以肯定是会对原List有影响的!
相关文章推荐
- Java8 ArrayList的实现
- ArrayList的实现
- ArrayList的实现原理--转
- ArrayList实现原理
- java的list几种实现方式的效率(ArrayList、LinkedList、Vector、Stack),以及 java时间戳的三种获取方式比较
- Java Collection Framework 中 ArrayList的实现
- Java集合----ArrayList实现原理
- js实现ArrayList功能
- List接口实现类-ArrayList、Vector、LinkedList集合深入学习以及源码解析
- 【转】ArrayList深拷贝的一种实现方法
- ArrayList工作原理及实现
- ArrayList的简单实现(手写)
- ArrayList的底层实现原理
- 如何实现Java的ArrayList经典实体类
- 模拟实现ArrayList的部分功能
- 深入Java集合学习系列:ArrayList的实现原理
- java中ArrayList的源码实现
- Java——(五)Collection之List集合、ArrayList和Vector实现类
- [Java]ArrayList与LinkedList的模拟实现
- List ADT的两种实现方式:ArrayList和LinkedList