zoukankan      html  css  js  c++  java
  • java 中的JDK封装的数据结构和算法解析(集合类)----顺序表 List 之 ArrayList

    1. 数据结构之List (java:接口)【由于是分析原理,这里多用截图说明】

        List是集合类中的容器之一,其定义如下:(无序可重复)

                   An ordered collection (also known as a sequence). The user of this interface has precise control over where in the list each element iinserted. The user can access elements by their     integer index (position in the list), and search for elements in the list.(一个有序集合(也称为序列)。用户界面精确控制列表中每个元素的位置插入。用户可以访问元素的整数索引(位置列表),搜索列  表中的元素。) 

     继承关系:public interface List<E> extends Collection<E> ---无序可重复的容器。

                   public interface Collection<E> extends Iterable<E> ---Collection是list和set的顶级接口,也是容器的意思。

                     collection 英文释义:征收; 收集,采集; 收藏品; 募捐;

                   public interface Iterable<T>  ---Iterable 说明该实现容器可以被迭代。

                   下是list接口的方法

    其中的List接口定义了元素的添加(add)和获取(get)方式以及集合被迭代(Iterable 可迭代接口),并没有说明集合的容器的实现方式,下面讲述分别List的实现类 ArrayList(用数组实现的list)和LinkedList(用链表实现的list)。

    List的动态数组实现方式--- ArrayList

       JDK对Arraylist的解释:Resizable-array implementation of the List interface. Implements all optional list operations, and permits all elements, includingnul. In addition to implementing the List interface,this class provides methods to manipulate the size of the array that is used internally to store the list. (This class is roughly equivalent to Vector, except that it is unsynchronized.)Array实现列表的接口。实现了 所有可选列表操作,并允许所有元素,包括 空字符。除了实现列表接口, 这个类提供了一些方法来操作数组的大小内部使用存储列表。(这类相当于Vector,除了它是同步的)。

    下面是RandomAccess

      其中:RandomAccess 是随机存取的意思:

                

          上面数百度贴吧的某哥们的解释,我觉得挺对。由此可见随机存取速度很快,高效。

        

    解析其中类的数据结构:Object[] EMPTY_ELEMENTDATA--- 对象数组

                                  Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA---对象数组,DEFAULTCAPACITY_EMPTY_ELEMENTDATA--也是一个空的对象数组,数组为空默认使用次对象,区别下次添加元素增加元素的个数。

                                  Object[] elementData---真正的数组元素存放在此,构造时初始化。

    三个成员函数分别对应三个ArrayList的构造函数

                Object[] EMPTY_ELEMENTDATA 对应构造方法: public ArrayList(int initialCapacity) {},当给定参数的initialCapacity等于0时elementData等价于EMPTY_ELEMENTDATA。

                Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA对应构造方法:应 public ArrayList() {},无参时elementData等价于DEFAULTCAPACITY_EMPTY_ELEMENTDATA。

     ArrayList原理:数据的添加:

                     每次add(T e) 添加元素是,都会检查数组是否够用,如果不够用动态进行添加。

                        

                 ensureCapacityInternal () 方法中判断增长后的数据长度是否大于当前数组的长度,如果大于,则进行递增:下图截图

                        

               grow()方法是增长数据,其实现方法如下:

                        

           可以看到java中数组最大值是int 的最大值,可以点源码hugeCapacity()查看。上图中的数组最终他由系统生成一个新的数组且将原来的数据拷贝到新数组。最终看到数组拷贝是Native修饰的,说明了这个方法是的本地实现,其可以保证速度大于new一个新数组。

            数据的遍历:

                         数据的遍历用到一个内部类来解决:如下图

                       

                   由于内部类可以访问到类的所有信息,而且private修饰不可以被外部访问到,可以说是正真体现了封装的特新。cursor代表当前的指针,如果发现当先指针等于数组的大小size怎返回没有下一个数组元素的boolean值false。

    最后对get方法说明:

                 

       get方法是直接拿到数组的第index个元素,说明其效率高。最后这个get方法没有看到同步的关键字synchronized修饰,可见此方法不支持多线程。

    总结:

            ArrayList是基于数组实现的List,其构造构造形式保持了默认的数组元素的个数,当动态添加元素的时候可以对数组进行动态的扩容(其实是重新生成一个比之前容量大的新数组,然后将就数组的数组元素的值重新copy到新数组)。而且数组的重新生成是用了system.copyArray()的本地函数,保证了其高效。对于数组的遍历其用内部类来实现,主要用到当前指针这个变量来判断是否有下一个元素。最后强调一点:ArrayList是线程不安全的,这或许一定程度上可以加快程序的执行。

  • 相关阅读:
    如何把样例从文件中输入程序
    蓝桥杯--高僧斗法(变形尼姆博弈)
    tensorflow笔记(北大网课实战)
    深度学习笔记
    尼姆博弈
    并查集
    蓝桥杯算法训练--指针
    NumPy笔记:均匀分布与正态分布
    NumPy学习:创建ndarray数组(linespace,arange,uniform,normal)
    NumPy笔记:数组去重
  • 原文地址:https://www.cnblogs.com/immer/p/5087858.html
Copyright © 2011-2022 走看看