Java集合类源码分析(二):List接口

我的github:xjwhhh的github
希望大家多多关注,共同进步

Java集合类源码分析(一):Collcetion接口
Java集合类源码分析(二):List接口
Java集合类源码分析(三):AbstractList类
Java集合类源码分析(四):ArrayList&LinkedList
java集合类源码分析(五):Map接口
Java集合类源码分析(六):AbstractMap类
Java集合类源码分析(七):HashMap&LinkedHashMap
Java集合类源码分析(八):AbstractSet类
Java集合类源码分析(九):HashSet&LinkedHashSet

List接口源码分析

default void replaceAll(UnaryOperator<E> operator) {
    Objects.requireNonNull(operator);
    final ListIterator<E> li = this.listIterator();
    while (li.hasNext()) {
        li.set(operator.apply(li.next()));
    }
}

对列表中的所有元素进行operator这样的操作,并用结果代替原来的元素

@SuppressWarnings({"unchecked", "rawtypes"})
default void sort(Comparator<? super E> c) {
    Object[] a = this.toArray();
    Arrays.sort(a, (Comparator) c);
    ListIterator<E> i = this.listIterator();
    for (Object e : a) {
        i.next();
        i.set((E) e);
    }
}

排序操作,对元素进行互相比较,比较方式按照Comparator定义的来,如果Comparator是null,那么需要列表中的所有元素实现了Comparable接口,就可以使用元素的比较方式

E get(int index);

通过索引获取元素,返回该元素

E set(int index, E element);

将index处的元素设置为element,返回index处原来的元素

void add(int index, E element);

将element插入到列表的index位置,将index处原来的元素和后继元素全部右移,长度加一

E remove(int index);

删除index处的元素,将后继元素全部左移,返回被删除的元素

int indexOf(Object o);

如果列表含有该对象,则返回它在列表中第一次出现的索引,否则返回-1

int lastIndexOf(Object o);

如果列表含有该对象,则返回它在列表中最后一次出现的索引,否则返回-1

ListIterator<E> listIterator();

返回一个列表迭代器

ListIterator<E> listIterator(int index);

返回一个列表迭代器,从index开始,即第一个调用ListIterator.next()返回的应该是index处的元素

List<E> subList(int fromIndex, int toIndex);

返回原来list的从[fromIndex, toIndex)之间这一部分的视图,之所以说是视图,是因为实际上,返回的list是靠原来的list支持的。

所以,你对原来的list和返回的list做的“非结构性修改”(non-structural changes),都会影响到彼此。

所谓的“非结构性修改”,是指不涉及到list的大小改变的修改。相反,结构性修改,指改变了list大小的修改。

如果发生结构性修改的是返回的子list,那么原来的list的大小也会发生变化;

而如果发生结构性修改的是原来的list(不包括由于返回的子list导致的改变),那么返回的子list语义上将会是undefined。在AbstractList(ArrayList的父类)中,undefined的具体表现形式是抛出一个ConcurrentModificationException。

因此,如果你在调用了sublist返回了子list之后,如果修改了原list的大小,那么之前产生的子list将会失效,变得不可使用。

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页