import java.util.Objects;
import java.util.function.UnaryOperator;
/**
* @Classname List:是Collection三大直接子接口之一,其他两大子接口包括Set和Queue接口
* @see:List针对线性表结构的,提供了对位置以及子表的操作,其数据可以为空,也可以重复,可以为null
* @note:List的实现类主要包括ArrayList\LinkedList\Vector。其中ArrayList作为默认选择,其本质上是一个数组
* @note:当插入、删除频繁时,使用LinkedList,其本质上是一个双向链表,Vector总是比ArrayList慢,尽量避免使用它
* @Version 1.0
*/
public interface List<E> extends Collection<E> {
boolean equals(Object other);
// 新增的默认实现方法,通过Iterator的方式对每个元素进行指定的操作
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);
}
}
/**
* @Title:跟迭代相关的方法
* @note:List继承了Collection的iterator()方法,可以获取Iterator,实现向后遍历
* @note:List还可以通过listIterator()方法,可以获取更强大的listIterator,进行向前向后遍历,
* 同时允许在使用next()或previous()方法后进行add,remove,set等操作
*/
// ListIterator继承于Iterator,主要增加了向前遍历、向后遍历的功能
ListIterator<E> listIterator();
// 从指定位置开始,返回一个ListIterator
ListIterator<E> listIterator(int index);
/**
* @Title:跟位置相关的方法
*/
// 获取指定位置的元素
E get(int index);
// 修改指定位置元素的值
E set(int index, E element);
// 在指定的位置添加元素
void add(int index, E element);
// 在指定的位置移除一个元素
E remove(int index);
// 在集合的指定位置插入当前集合
boolean addall(int index,Collection<E> c);
/**
* @Title:跟搜索相关的方法
*/
// 返回一个元素在集合中第一次出现的位置
int indexOf(Object o);
// 返回一个元素在集合中最后一次出现的位置
int lastIndexOf(Object o);
/**
* @Title:跟范围性操作相关的方法
* @note:返回一个范围[fromIndex,toIndex)子集合,注意这是个左闭右开
* @note:这里并不是把List的范围元素拷贝进subList中,两者依旧是指向的同一个引用,因此对subList的操作依旧会原有的List,代码可以见AbstractList
*/
List<E> subList(int fromIndex, int toIndex);
/**
* @Title:跟转换相关的方法
*/
// 返回一个包含List中所有元素的数组
Object[] toArray();
// 作用同上,不同的是当数组 array 的长度比 List集合元素个数多时,会使用数组 array 保存 List 中的元素;
// 否则会创建一个新的 数组存放 List 中的所有元素
<T> T[] toArray(T[] a);
}
/**
* 1.List和Array的区别?
* (1)Array可以存放任何类型,List不可以存放基本数据类型,必须要包装
* (2)Array不可以动态增长,List可以动态增长,且ArrayList有扩容机制,LinkedList没有扩容机制可以无限增长,因为它是双向链表
*/