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,线程安全,其它线程会暂停,所以效率低
时间: 2024-11-03 20:58:55