List总结

List接口
public interface List<E> extends Collection<E>

继承了Collection接口中的所有方法,并且有自己的新增方法:

//继承于Collection接口的方法
int size();
boolean isEmpty();
boolean contains(Object o);
Iterator<E> iterator();
Object[] toArray();
<T> T[] toArray(T[] a);
boolean add(E e);
boolean remove(Object o);
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E> c);
boolean removeAll(Collection<?> c);
default boolean removeIf(Predicate<? super E> filter);
boolean retainAll(Collection<?> c);
void clear();
boolean equals(Object o);
int hashCode();

//新增方法
boolean addAll(int index, Collection<? extends E> c);
default void replaceAll(UnaryOperator<E> operator);
default void sort(Comparator<? super E> c);
E get(int index);
E set(int index, E element);
void add(int index, E element);
E remove(int index);
int indexOf(Object o);
int lastIndexOf(Object o);
ListIterator<E> listIterator();
ListIterator<E> listIterator(int index);
List<E> subList(int fromIndex, int toIndex);

可见List的元素都有自己的索引,是有序集合
其中listIterator()方法返回的是ListIterator迭代器,与iterator()方法返回的Iterator迭代器有所不同
Iterator接口:

public interface Iterator<E>

boolean hasNext();
E next();
default void forEachRemaining(Consumer<? super E> action);

ListIterator接口:

public interface ListIterator<E> extends Iterator<E>

boolean hasNext();
E next();
boolean hasPrevious();
E previous();
int nextIndex();
int previousIndex();
void remove();
void set(E e);
void add(E e);

可见ListIterator接口增加了索引以及向前遍历的概念

List类

抽象类AbstractList继承了AbstractCollection类
抽象类AbstractSequentialList继承了AbstractList类
集合类ArrayList继承了AbstractList类
集合类LinkedList继承了AbstractSequentialList类
它们也都实现了List接口

ArrayList源码分析

声明:

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
transient Object[] elementData;

此为底层数据元素,可见ArrayList基于数组
看其构造方法:

public ArrayList(int initialCapacity);
public ArrayList();
public ArrayList(Collection<? extends E> c);

看其他方法:

public void trimToSize();
public void ensureCapacity(int minCapacity);
public int size();
public boolean isEmpty();
public boolean contains(Object o);
public int indexOf(Object o);
public int lastIndexOf(Object o);
public Object clone();
public Object[] toArray();
public <T> T[] toArray(T[] a);
public E get(int index);
public E set(int index, E element);
public boolean add(E e);
public void add(int index, E element);
public E remove(int index);
public boolean remove(Object o);
public void clear();
public boolean addAll(Collection<? extends E> c);
public boolean addAll(int index, Collection<? extends E> c);
public boolean removeAll(Collection<?> c);
public boolean retainAll(Collection<?> c);
public ListIterator<E> listIterator(int index);
public ListIterator<E> listIterator();
public Iterator<E> iterator();

    //Iterator迭代器方法
    public boolean hasNext();
    public E next();
    public void remove();
    public void forEachRemaining(Consumer<? super E> consumer);

    //ListIterator迭代器方法
    //继承自Iterator迭代器的方法
    public boolean hasNext();
    public E next();
    public void remove();
    public void forEachRemaining(Consumer<? super E> consumer);
    public boolean hasPrevious();
    //新增方法
    public int nextIndex();
    public int previousIndex();
    public E previous();
    public void set(E e);
    public void add(E e);

public List<E> subList(int fromIndex, int toIndex);
public Spliterator<E> spliterator();
public void forEach(Consumer<? super E> action);
public boolean removeIf(Predicate<? super E> filter);
public void replaceAll(UnaryOperator<E> operator);
public void sort(Comparator<? super E> c);

综上可知,ArrayList是有序集合,可动态改变,底层完全基于数组实现,随机存取效率较高

LinkedList源码分析

声明

public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable

其实现了Deque接口,所以也会有一些队列方法

transient Node<E> first;
transient Node<E> last;
private static class Node<E> {
        E item;
        Node<E> next;
        Node<E> prev;

        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
}

可见其底层基于链表实现
看构造方法:

public LinkedList();
public LinkedList(Collection<? extends E> c);

看其他方法:

public E getFirst();
public E getLast();
public E removeFirst();
public E removeLast();
public void addFirst(E e);
public void addLast(E e);
public boolean contains(Object o);
public int size();
public boolean add(E e);
public boolean remove(Object o);
public boolean addAll(Collection<? extends E> c);
public boolean addAll(int index, Collection<? extends E> c);
public void clear();
public E get(int index);
public E set(int index, E element);
public void add(int index, E element);
public E remove(int index);
public int indexOf(Object o);
public int lastIndexOf(Object o);

//队列方法(链表头为队头)
public E peek();//队列为空则返回null
public E element();//队列为空则抛异常
public E poll();//队列为空则返回null
public E remove();//队列为空则抛异常
public boolean offer(E e);//队尾入队

//双端队列方法
public boolean offerFirst(E e);
public boolean offerLast(E e);
public E peekFirst();
public E peekLast();
public E pollFirst();
public E pollLast();

//栈方法(链表头为栈顶)
public void push(E e);
public E pop();

public boolean removeFirstOccurrence(Object o);
public boolean removeLastOccurrence(Object o);
public ListIterator<E> listIterator(int index);
public Iterator<E> descendingIterator();
public Object clone();
public Object[] toArray();
public <T> T[] toArray(T[] a);
public Spliterator<E> spliterator();

综上可知,LinkedList是有序集合,可动态改变,底层基于链表实现,插入删除效率较高,并且可以用来表示队列、双端队列、栈这些数据结构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值