基础篇之集合(List)总结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础篇之集合(List)总结相关的知识,希望对你有一定的参考价值。

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)总结的主要内容,如果未能解决你的问题,请参考以下文章

基础篇之集合总结

NHibernate3剖析:Mapping篇之集合映射基础:List映射

201621123062《java程序设计》第九周作业总结

高级程序员必须精通的Redis,第四篇之——set(集合)

打卡30篇博文精通Redis第二篇之——list(列表)

高级程序员必须精通的Redis,第五篇之——zset(有序集合)