它代表一种有序的集合,也被叫做序列。你可以决定每个元素在集合中的插入位置,同时也可以用索引来访问集合里面的元素。
它和Set不同,它允许有重复的元素存在,也就是说有成对的2个元素e1和e2,e1.equals(e2)。
在List中有4类用位置来访问元素的方法。它和数组一样,是从0开始计数的。这些操作的性能是与集合里面的元素的个数成正比。也就是说你用遍历的方式性能并不优于用索引的方式。
List提供了一个特别的迭代器叫ListIterator。它允许元素的插入,替换以及双向访问集合的能力,这些都是Iterator接口没有的。
它的搜索方法的性能都是线性的,效率是比较低的,所以使用的时候要注意。
它的插入和删除是比较高效的。
下面看看它的一些方法。
注意:List里面的add和remove方法是没有实现的。这和AbstractCollection不一样。另外List里面加了一些新的方法,比如:sort,indexOf,subList,listIterator,set等。
其中replaceAll和sort方法是有默认实现的,replaceAll就用到了ListIterator来遍历和替换集合里面的值,sort方法用到了Arrays.sort方法和ListIterator。
default void replaceAll(UnaryOperator<E> operator) {
Objects.requireNonNull(operator);
final ListIterator<E> li = this.listIterator();
while (li.hasNext()) {
li.set(operator.apply(li.next()));
}
}
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);
}
}
需要注意的就是在调用sort方法的时候,list必须实现了Comparable.
另外,UnaryOperator是一个函数式接口。
static <T> UnaryOperator<T> identity() {
return t -> t;
}它的作用是返回传入的参数的值。它继承了Function。可以说它是Function的一个特殊情况。Function要表达的意思是接收一个参数返回一个值。