java的list及其浅谈实现类ArrayList和LinkedList

66 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情

前言

前面讲了集合的Collection接口,以及这个接口的对应方法,感兴趣的朋友可以前往我们的主页观看这篇文章。所以今天我们讲一下Collection的主要子接口List,以及重要的实现子类ArrayList和linkedList.

List

List接口继承了Collection接口的大多数方法,与之相似的我们这里就不再过多叙述。就介绍一下List独有之处和创新点。

public interface List<E> extends Collection<E> {

E get(int index);
E set(int index, E element);
void add(int index, E element);
 E remove(int index);
 }

以上这些就是比较独特的。相信大家也看的出来与Collection的区别就是在add和remove(这两个方法的正常版本也是有的)中多了传入的参数index,以及新增的方法get和set方法。众所周知,index是索引的意思,就代表着你可以通过这个索引进行一些操作。下面是对应实现的两个重要实现子类

arrayList和LinkListed

先看这两者的英文名称你就大概知道是怎么回事了。ArrayList是使用数组形式完成的list集合,而对于数组我们知道查找和修改的效率非常快,对于这种类型的操作只需要花费常数时间。但是与此同时,我们也知道数组的插入是比较麻烦的。这个时候我们就可以考虑LinkListed类了,对于链表,插入和删除都是比较都是开销很小的。而且linkedlist的对应节点是双向链表。

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 E getLast() {
    final Node<E> l = last;
    if (l == null)
        throw new NoSuchElementException();
    return l.item;
}
 public E removeFirst() {
        final Node<E> f = first;
        if (f == null)
            throw new NoSuchElementException();
        return unlinkFirst(f);
    }

但是对于ArrayList可以轻易做到的事,例如查找和get的操作,他的花销又是非常的大的。

总结今天简单介绍了一下ArrayList和linkedlist的一些特点和对应的方法,下节将从源码角度看这两个类。