码迷,mamicode.com
首页 > 其他好文 > 详细

基础篇之集合(一)(List)总结

时间:2017-09-04 15:06:27      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:底部   双向链表   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,线程安全,其它线程会暂停,所以效率低

基础篇之集合(一)(List)总结

标签:底部   双向链表   item   boolean   信息   tor   next   效率   分析法   

原文地址:http://www.cnblogs.com/gg128/p/7473192.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!