java.util.LinkedList

1、底层为双向链表

2、内部类:

private static class Node<E> {
    E item; //本身
    Node<E> next; //下一个,如果该元素是最后一个,那么next == null
    Node<E> prev; //上一个,如果该元素为第一个,那么prev == null 

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

3、add(E e),默认是增加在最后,与之相似的还有addFirst(E),addLast(E),offer(E),offerFirst(E),offerLast(E)原理相同,push(E e)是默认的增加在第一个

public boolean add(E e) {
    linkLast(e);
    return true;
}
/**
 * Links e as last element.
 */
void linkLast(E e) {
    final Node<E> l = last; //获取最后一个元素
    final Node<E> newNode = new Node<>(l, e, null);  // newNode成为了last
    last = newNode;
    if (l == null) 
        first = newNode;  //如果空数组的情况
    else
        l.next = newNode; //反之不空的情况
    size++; 
    modCount++;
}

4、remove(Object o) 如果是remove()是默认移除removeFirst()

public boolean remove(Object o) {
    if (o == null) {
        for (Node<E> x = first; x != null; x = x.next) {
            if (x.item == null) {
                unlink(x);
                return true;
            }
        }
    } else {
        for (Node<E> x = first; x != null; x = x.next) {
            if (o.equals(x.item)) {
                unlink(x);
                return true;
            }
        }
    }
    return false;
}
//比如为1,2,3,要移除的是2

E unlink(Node<E> x) {
    // assert x != null;
    final E element = x.item;    //2
    final Node<E> next = x.next; //3
    final Node<E> prev = x.prev; //1

    if (prev == null) {
        first = next;
    } else {
        prev.next = next;  //1的next指向3
        x.prev = null;  
    }

    if (next == null) {
        last = prev;  //如果next==null,代表x为last,那么last=prev
    } else {
        next.prev = prev; // 3 指向 1
        x.next = null;
    }

    x.item = null; 
    size--;
    modCount++;
    return element; 
}

5、set(int index, E element)

public E set(int index, E element) {
    checkElementIndex(index);
    Node<E> x = node(index);
    E oldVal = x.item;
    x.item = element;
    return oldVal;
}

6、peek的都是获取的方法,poll是移除的方法,这些都是允许LinkedList为空。element()获取第一个,前提是LinkedList不为空,否则抛出NoSuchElementException

public E peek() {
    final Node<E> f = first;
    return (f == null) ? null : f.item;
}
public E peekFirst() {
    final Node<E> f = first;
    return (f == null) ? null : f.item;
 }
public E peekLast() {
    final Node<E> l = last;
    return (l == null) ? null : l.item;
}
public E poll() {
    final Node<E> f = first;
    return (f == null) ? null : unlinkFirst(f);
}
ublic E pollFirst() {
    final Node<E> f = first;
    return (f == null) ? null : unlinkFirst(f);
}
public E pollLast() {
    final Node<E> l = last;
    return (l == null) ? null : unlinkLast(l);
}
public E element() {
    return getFirst();
}

7、总结,ArrayList和LinkedList的区别

  •     ArrayList的插入,删除数据慢,查询快
  •     LinkedList的插入,删除数据快,查询慢

转载于:https://my.oschina.net/u/4055223/blog/3077211

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值