Java源码

【List源码】List源码二

2019-07-12  本文已影响31人  秀叶寒冬

【Java】List源码一

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

上述是一个排序函数,传入的参数是一个Comparator对象,后续会写这个的源码。#1是将list链表转化为一个Object类型的数组。#2是调用数组Arrays(后续会写该源码)的排序函数,排序方法是根据Comparator指定的方法排序。参数a是要排序的数组,c指定了排序的方法(是降序还是升序等);#3创建一个链表迭代器的引用,并将当前List链表的迭代器赋值给该引用。#4使用for循环遍历Object数组,将Object数组中的值存入到链表迭代器中。

void clear();

该方法移除链表中所有的元素。

boolean equals(Object o);

比较链表中两个元素是否相同,具体的比较要看具体的实现

int hashCode();

计算链表的hashCode值

E get(int index);

获取链表中指定位置的元素。如果index<0||index>=size则会报数组越界异常。

E set(int index, E element);

用指定的值取代链表中指定位置的值。如果index<0||index>=size会报数组越界异常。

void add(int index, E element);

在链表的指定位置插入指定的元素,并将当前位置和之后的元素(如果有的话)向右移动。如果index<0||index>size则会报index越界异常。所以在size处是可以插入元素的。

E remove(int index);

移除链表中指定位置的元素。如果index<0||index>=size则报IndexOutOfBoundsException异常。

int indexOf(Object o);

返回链表中第一个与指定元素匹配的索引,如果链表中不包含指定元素,则返回-1.

int lastIndexOf(Object o);

返回链表中最后一次出现指定元素的索引,如果链表中不包含该元素,则返回-1。

ListIterator<E> listIterator();

该方法返回一个链表迭代器

ListIterator<E> listIterator(int index);

返回一个从指定位置开始的链表迭代器。

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

截取链表中从fromIndex开始到toIndex之间的链表,如果fromIndex=toIndex,则返回的是一个空链表

@Override
    default Spliterator<E> spliterator() {
        return Spliterators.spliterator(this, Spliterator.ORDERED);
    }

Spliterator接口是1.8新加的接口,字面意思可分割的迭代器,不同以往的iterator需要顺序迭代,Spliterator可以分割为若干个小的迭代器进行并行操作,既可以实现多线程操作提高效率,又可以避免普通迭代器的fail-fast机制所带来的异常。Spliterator可以配合1.8新加的Stream进行并行流的实现,大大提高处理效率。Spliterator.ORDERED表示元素是有序的(这个有序表示每个元素的前后关系不变,每次遍历的结果相同)

上一篇 下一篇

猜你喜欢

热点阅读