开启掘金成长之旅!这是我参与「掘金日新计划 · 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的一些特点和对应的方法,下节将从源码角度看这两个类。