案例使用的是JDK8的API
1.介绍
java.util.List是一个接口,该接口继承了Collection接口。
2.关注点
- Collection(父接口)
- Set(接口)
- ArrayList(子类实现)
- LinkedList(子类实现)
- Vector(子类实现)
- Arrays#asList(Object[])(工具类转换方法)
- Collections#nCopies(int, Object)(工具类转换方法)
- Collections#EMPTY_LIST(工具类转换方法)
- AbstractList(相关抽象类)
- AbstractSequentialList(相关抽象类)
3.源码剖析
public interface List<E> extends Collection<E> {
/**
* 定义addAll方法,从某个index开始插入指定集合实例
*/
boolean addAll(int index, Collection<? extends E> c);
/**
* 定义removeAll方法,从某个index开始删除指定集合实例
*/
boolean removeAll(Collection<?> c);
/**
* 定义removeAll方法,从某个index开始删除指定集合实例
*/
boolean retainAll(Collection<?> c);
/**
* jdk1.8新增
* 大意为:
* 定义replaceAll方法,根据传递参数的函数式,传递内容是接口类型
* 该接口定义了operator函数,该函数传递给Objects.requireNonNull进行判断
* 匹配成功则进行set值进行替换,使用List迭代器进行迭代替换
* @since 1.8
*/
default void replaceAll(UnaryOperator<E> operator) {
Objects.requireNonNull(operator);
final ListIterator<E> li = this.listIterator();
while (li.hasNext()) {
li.set(operator.apply(li.next()));
}
}
/**
* jdk1.8新增
* 大意为:
* 定义sort方法,根据传递参数的函数式,传递内容是接口类型
* 该接口定义了Comparator函数,该函数传递给Arrays.sort进行判断并排序
* 并根据排序结果,使用迭代器迭代并重新set进List
* @since 1.8
*/
@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);
}
}
/**
* List要求,定义get方法,获取指定index的值
*/
E get(int index);
/**
* List要求,定义set方法,在指定index的元素设置为目标元素
*/
E set(int index, E element);
/**
* List要求,定义add方法,在指定index添加指定元素
*/
void add(int index, E element);
/**
* List要求,定义remove方法,从指定的index删除该元素并重新调整List
*/
E remove(int index);
/**
* List要求,定义indexOf方法,正序查询指定元素第一次出现的index序号
*/
int indexOf(Object o);
/**
* List要求,定义lastIndexOf方法,倒叙查询指定元素第一次出现的的index序号
*/
int lastIndexOf(Object o);
/**
* List要求,定义ListIterator迭代器方法,获取该List的迭代器
*/
ListIterator<E> listIterator();
/**
* List要求,定义ListIterator迭代器方法,获取从指定index开始的指定迭代器
*/
ListIterator<E> listIterator(int index);
/**
* List要求,定义subList方法,从起始和结束index拆分出新的list
*/
List<E> subList(int fromIndex, int toIndex);
/**
* jdk1.8新增
* 大意为:
* 根据当前的list内容进行排序,进行迭代器拆分,拆分成新的迭代器
* 用于多线程迭代使用
* @since 1.8
*/
@Override
default Spliterator<E> spliterator() {
return Spliterators.spliterator(this, Spliterator.ORDERED);
}