LinkedList解析


1.基本特性:

  • 基于List接口,以双向链表的形式实现
  • 在插入/删除 性能上 优于 ArrayList, 在随机访问 上 差于 ArrayList
  • 允许所有元素为NULL
  • 实现Deque接口,可以基于LinkedList 进行堆栈,双端队列操作
  • 线程不安全,若有需要,可以使用 Collections.synchronizedList()方法进行转换成线程安全的
  • 支持序列化,实现了Serializable接口
  • 实现了Clone 接口
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, Serializable {
    transient int size;
    transient LinkedList.Node<E> first;
    transient LinkedList.Node<E> last;
    private static final long serialVersionUID = 876323262645176354L;
}

2.基本API 源码实现

1,set() 方法 :
public E set(int index, E element) {
    checkElementIndex(index);//检查是否越界
    Node<E> x = node(index);//获取对应索引位置的结点
    E oldVal = x.item;
    x.item = element;//赋新值
    return oldVal;
}
2.get()方法
public E get(int index) {
    checkElementIndex(index);//检查是否越界
    return node(index).item;//返回对应索引的节点
}

分析:

set(),get()方法逻辑都很简单明了,都需要 先检查索引,然后通过 node(int index) 函数获得节点,node()函数这里我们打开看一下:

Node<E> node(int index) {
    // assert isElementIndex(index);
    if (index < (size >> 1)) {
        Node<E> x = first;
        for (int i = 0; i < index; i++)
        x = x.next;
        return x;
    } else {
        Node<E> x = last;
        for (int i = size - 1; i > index; i--)
        x = x.prev;
        return x;
    }
}

该函数以 O(n/2) 的性能去寻找index位置上的结点 :

  1. 先以size的中间为界限,判断index在size的前一半还是后一半, size >> 1表示位运算,相当于 size/2.
  2. 如果是index在前一半,则从head节点开始向后查找
  3. 如果是后一半,则从尾节点 开始向前查找

3.常见API

添加方法:

  • boolean add(E e) : 添加元素到列尾
  • void add(int index,E e) : 添加元素到指定位置
  • boolean addAll (Collection< ? extends E > c) : 添加集合到列尾
  • boolean addAll(int x,Collection< ? extends E > c) : 添加集合到指定位置
  • void addFirst(E e) : 添加元素到列的头部
  • void addLast(E e) : 添加元素到列尾

查找方法:

  • E element() : 获取表头元素
  • E get(int index) : 获取指定位置的元素
  • E getFirst() : 获取表头元素
  • E getLast() : 获取列尾元素
  • int indexOf(Object o) : 返回链表中第一次出现指定元素的索引,否则返回-1
  • E poll() : 获取并删除表头元素
  • E pollLast() : 获取并删除列尾元素,没有则返回空

删除方法:

  • void clear() : 清除列表的所有元素
  • E remove() : 删除并返回表头元素
  • E remove(int index) : 删除并返回指定位置的元素
  • E removeLast() : 删除并返回列尾元素
  • boolean removeFirstOccurrence(Object o) :删除并返回第一次出现的指定元素
  • boolean removeLastOccurrence(Object o) :删除并返回最后一次出现的指定元素

其他:

  • boolean contains(Object o) : 是否含有指定元素
  • E set(int index,E e) : 设置指定位置的值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值