ArrayList.subList() 截取数组元素的底层
程序员还是看代码说话:
List<String> list=new ArrayList(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); list.add("e"); List<String> list2 = list.subList(0, 2); list2.remove("b"); System.out.println("------2222---------"); list2.stream().forEach(System.out::println); System.out.println("------1111---------"); list.stream().forEach(System.out::println);
输出结果:
------2222--------- a ------1111--------- a c d e
list2输出还能理解,但原先的list输出就看不懂了???
点击 list.subList 进入到源代码中
public List<E> subList(int fromIndex, int toIndex) { subListRangeCheck(fromIndex, toIndex, size); return new SubList(this, 0, fromIndex, toIndex); }
返回的是
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; } public int size() {} public void add(int index, E e) {} public E remove(int index) {} protected void removeRange(int fromIndex, int toIndex) {} public boolean addAll(Collection<? extends E> c) {} public boolean addAll(int index, Collection<? extends E> c) {} public Iterator<E> iterator() {} public ListIterator<E> listIterator(final int index) {} public List<E> subList(int fromIndex, int toIndex) { subListRangeCheck(fromIndex, toIndex, size); return new SubList(this, offset, fromIndex, toIndex); } private void rangeCheck(int index) {} private void rangeCheckForAdd(int index) {} private String outOfBoundsMsg(int index) { } private void checkForComodification() {} public Spliterator<E> spliterator() {} }
可以看到,这个SubList 其实并没有多创建一个新的list,只是把SubList 的下标映射到原先List的下标,也就是说,SubList和原先List其实指的还是同样对象,所以当对SubList或者原先List进行add、remove等操作,两个的元素都是会改变的