List的子类源码笔记

Vector

  1. new Vector(),初始化长度为10的数组,增量为0
  2. public synchronized boolean add(E e) 。线程安全方法+synchronized锁。默认扩容为原来的2倍,如果手动指定了capacityIncrement的值,那么就可以按照指定的增量进行扩容。
  3. public synchroniezed boolean insertElementAt (E e,int index)。① .考虑扩容 [ ensureCapacityHelper(elementCount + 1);], ② . 移动元素[ System.arraycopy(elementData, index, elementData, index + 1, elementCount - index);],③ 添加元素[ elementData[index] = obj; ],④ .元素个数增加[ elementCount++; ]。
  4. public synchronized remove(int index).

ArrayList

  1. new ArrayList()。JDK1.7,1.8初始化长度为0的空数组,empty_elementdata,defaultcapacity_empty_elementdata。JDK1.6初始化长度为10的数组。避免浪费空间。
  2. private void add(E e),第一次添加元素,扩容为长度为10的数组。扩容为1.5倍。

Stack

Stack是Vector的子类。

  1. peek()
  2. pop():  先peek,再删除size-1位置的元素。
  3. push()

LinkedList

  1. new LinkedList().什么也没干,也没有添加节点。
  2. public void add(E e){ linkLast(e); } .添加在最后。
  3. public void remove(Object o);
void linkLast(E e){
    final Node<E> l=last;
    final Node<E> newNode=new Node<>(l,e,null);
    last=newNode;
    if(l==null)
        first=newNode;
    else l.next=newNode;
    size++;
    modCount++;
}

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 boolean remove(Obejct 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.equal(x.item)){
            unlink(x);
            return true;
        }
    }
 }
 return false;
}

E unlink(Node<E> x) {
        // assert x != null;
        final E element = x.item; //当前要删除的节点数据。
        final Node<E> next = x.next; // 被删除节点的下一个节点
        final Node<E> prev = x.prev; // 被删除节点的上一个节点

        if (prev == null) { // 当前节点是第一个,则Pre为null
            first = next;
        } else {
            prev.next = next;
            x.prev = null;
        }

        if (next == null) {  // 当前节点是最后一个。
            last = prev;
        } else {
            next.prev = prev;
            x.next = null;
        }

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值