标签:底部 双向链表 item boolean 信息 tor next 效率 分析法
1. List集合下常用的集合(ArrayList,LinkedList,Vector);
JVM垃圾回收GC,Java中采取了可达性分析法,标记所有从根节点开始的可达对象,未被标记的对象就是未被引用,但是没有引用的不一定会被作为垃圾清理,因为有些是可复活对象,这里不作说明,除以上情况以外的会被作为垃圾清理,什么时候开始清理,这个涉及到内存机制,这里不作说明,详情可见垃圾复制算法等。
1)LinkedList:LinkedList底部是基于链表,元素可重复,线程不安全,查询慢,增删快;
原因:
基于链表:源码分析
//第一个对象的引用和最后一个对象的引用
transient Node<E> first;
transient Node<E> last;
//每个元素的头(前一个对象的引用),中(自己本身的信息),尾(下一个对象的引用)
E item;
Node<E> next;
Node<E> prev;
元素可重复:源码分析
//没有去重机制
public boolean add(E e) {
linkLast(e);
return true;
}
void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
//最后一个元素指向新加入的元素
last = newNode;
//l是否为null
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
线程不安全: 其它线程不会暂停;
查询慢,增删快: 双向链表,从头或者从尾开始查询(依据size >> 1//除2),所以慢,增删只需要更改上面基于链表中的next和prev的所以快
2)ArrayList:ArrayList底部是基于数组,元素可重复,线程不安全,查询快,增删慢;
原因:
基于数组,源码分析:
transient Object[] elementData
元素可重复:源码分析
//没有去重机制
public boolean add(E e) {
ensureCapacityInternal(size + 1);
elementData[size++] = e;
return true;
}
线程不安全:其它线程不会暂停;
查询快,增删慢: 基于数组所以查询快,增删慢原因如下:
System.arraycopy(elementData, index+1, elementData, index,numMoved);
3)Vector:Vector底部是基于数组,元素可重复,线程安全,效率低
类似于ArrayList,但在其基础上添加了synchronized,线程安全,其它线程会暂停,所以效率低
标签:底部 双向链表 item boolean 信息 tor next 效率 分析法
原文地址:http://www.cnblogs.com/gg128/p/7473192.html