9.3-全栈Java笔记:List接口常用实现类的特点和底层实现

上节我们讲到「List接口的特点和常用方法」,本节接着上节的内容继续深入学习。


课前回顾: 

List接口常用的实现类有3个:ArrayList、LinkedList、Vector。

那么它们的特点和底层实现有哪些呢?

ArrayList特点和底层实现


ArrayList底层是用数组实现的存储。

特点:查询效率高,增删效率低,线程不安全。我们一般使用它。

9.3-全栈Java笔记:List接口常用实现类的特点和底层实现_第1张图片

查看源码,我们可以看出ArrayList底层使用Object数组来存储元素数据。所有的方法,都围绕这个核心的Object数组来开展。


ArrayList是可以存放任意数量的对象,数组长度是有限的,那么是怎么实现的呢?

本质上就是通过定义新的更大的数组,将旧数组内容拷贝到新数组,来实现扩容。

ArrayList的Object数组初始化长度为10,如果我们存储满了这个数组,需要存储第11个对象,就会定义新的数组长度长度更大的数组,并将将原数组内容和新的元素一起加入到新数组中,源码中代码如下:

 public void   ensureCapacity(int   minCapacity) {

    modCount++;

    int   oldCapacity = elementData.length;

    if   (minCapacity > oldCapacity) {

        Object oldData[] =   elementData;

        int   newCapacity = (oldCapacity * 3)/2 + 1;

         if   (newCapacity < minCapacity)

       newCapacity = minCapacity;

            //   minCapacity is usually close to size, so this is a win:

            elementData =   Arrays.copyOf(elementData, newCapacity);

    }

}

LinkedList特点和底层实现

LinkedList底层用双向链表实现的存储。

特点:查询效率低,增删效率高,线程不安全。

双向链表也叫双链表,是链表的一种,它的每个数据节点中都有两个指针,分别指向前一个节点和后一个节点。 所以,从双向链表中的任意一个节点开始,都可以很方便地找到所有节点。

每个节点都应该有3部分内容:

    class  Node {

       Node  previous;   //前一个节点

       Object  element;    //本节点保存的数据

       Node  next;       //后一个节点

}

我们查看LinkedList的源码,可以看到里面包含了双向链表的相关代码:

9.3-全栈Java笔记:List接口常用实现类的特点和底层实现_第2张图片

注:entry在英文中表示“进入、词条、条目”的意思。在计算机英语中一般表示“项、条目”的含义。

Vector向量

Vector底层用数组实现的List,相关的方法都加了同步检查,因此“线程安全,效率低”。 比如,indexOf方法就增加了synchronized同步标记。

【图】Vector的源码(indexOf方法)

老鸟建议

如何选用ArrayList、LinkedList、Vector?

·线程安全时,用Vector。

· 局部变量不存在线程安全问题时,并且查找较多用ArrayList(一般使用它)

·局部变量不存在线程安全问题时,增加或删除元素较多用LinkedList。





「全栈Java笔记」是一部能帮大家从零到一成长为全栈Java工程师系列笔记。笔者江湖人称 Mr. G,10年Java研发经验,曾在神州数码、航天院某所研发中心从事软件设计及研发工作,从小白逐渐做到工程师、高级工程师、架构师。精通Java平台软件开发,精通JAVAEE,熟悉各种流行开发框架。


笔记包含从浅入深的六大部分:

A-Java入门阶段

B-数据库从入门到精通

C-手刃移动前端和Web前端

D-J2EE从了解到实战

E-Java高级框架精解

F-Linux和Hadoop 

你可能感兴趣的:(9.3-全栈Java笔记:List接口常用实现类的特点和底层实现)