java ArrayList 的实现原理

原创 2016年08月31日 15:55:15

1.ArrayList这是我们经常使用到的类,但是对于他是怎么实现的?我们来看一下:

    /**
     * Constructs a new instance of {@code ArrayList} with the specified
     * initial capacity.
     *
     * @param capacity
     *            the initial capacity of this {@code ArrayList}.
     */
    public ArrayList(int capacity) {
        if (capacity < 0) {
            throw new IllegalArgumentException("capacity < 0: " + capacity);
        }
        array = (capacity == 0 ? EmptyArray.OBJECT : new Object[capacity]);
    }

    /**
     * Constructs a new {@code ArrayList} instance with zero initial capacity.
     */
    public ArrayList() {
        array = EmptyArray.OBJECT;
    }

    /**
     * Constructs a new instance of {@code ArrayList} containing the elements of
     * the specified collection.
     *
     * @param collection
     *            the collection of elements to add.
     */
    public ArrayList(Collection<? extends E> collection) {
        if (collection == null) {
            throw new NullPointerException("collection == null");
        }

        Object[] a = collection.toArray();
        if (a.getClass() != Object[].class) {
            Object[] newArray = new Object[a.length];
            System.arraycopy(a, 0, newArray, 0, a.length);
            a = newArray;
        }
        array = a;
        size = a.length;
    }
这就是他的构造参数,从里面你可以看出,他就是一个数组,而他的重要属性就是这些:

/**
     * The minimum amount by which the capacity of an ArrayList will increase.
     * This tuning parameter controls a time-space tradeoff. This value (12)
     * gives empirically good results and is arguably consistent with the
     * RI's specified default initial capacity of 10: instead of 10, we start
     * with 0 (sans allocation) and jump to 12.
     */
    private static final int MIN_CAPACITY_INCREMENT = 12;

    /**
     * The number of elements in this list.
     */
    int size;

    /**
     * The elements in this list, followed by nulls.
     */
    transient Object[] array;
一个数组,一个大小,一个限定值。既然是一个数组那就我们就可以想象的到他的增删数据都是数组数据的移动,我们来验证一下我们的想法:
/**
     * Adds the specified object at the end of this {@code ArrayList}.
     *
     * @param object
     *            the object to add.
     * @return always true
     */
    @Override public boolean add(E object) {
        Object[] a = array;
        int s = size;
        if (s == a.length) {
            Object[] newArray = new Object[s +
                    (s < (MIN_CAPACITY_INCREMENT / 2) ?
                     MIN_CAPACITY_INCREMENT : s >> 1)];
            System.arraycopy(a, 0, newArray, 0, s);
            array = a = newArray;
        }
        a[s] = object;
        size = s + 1;
        modCount++;
        return true;
    }
果然,新建了一个数组,然后数据拷贝,然后新数据的赋值,在这个类中频繁的使用到了 System.arraycopy,Arrays.fill 数组的拷贝。
    /**
     * Removes the object at the specified location from this list.
     *
     * @param index
     *            the index of the object to remove.
     * @return the removed object.
     * @throws IndexOutOfBoundsException
     *             when {@code location < 0 || location >= size()}
     */
    @Override public E remove(int index) {
        Object[] a = array;
        int s = size;
        if (index >= s) {
            throwIndexOutOfBoundsException(index, s);
        }
        @SuppressWarnings("unchecked") E result = (E) a[index];
        System.arraycopy(a, index + 1, a, index, --s - index);
        a[s] = null;  // Prevent memory leak
        size = s;
        modCount++;
        return result;
    }

这里有一个值得注意的地方就是新数组的大小,怎么进行扩大呢?

    /**
     * This method controls the growth of ArrayList capacities.  It represents
     * a time-space tradeoff: we don't want to grow lists too frequently
     * (which wastes time and fragments storage), but we don't want to waste
     * too much space in unused excess capacity.
     *
     * NOTE: This method is inlined into {@link #add(Object)} for performance.
     * If you change the method, change it there too!
     */
    private static int newCapacity(int currentCapacity) {
        int increment = (currentCapacity < (MIN_CAPACITY_INCREMENT / 2) ?
                MIN_CAPACITY_INCREMENT : currentCapacity >> 1);
        return currentCapacity + increment;
    }
到这里,可以了解到ArrayList 实际就是一个数组,他不能保证线程安全。


版权声明:本文为博主原创文章,未经博主允许不得转载。

深入学习java之ArrayList 实现原理(一)

最近有时间整理了一下ArrayLIst的实现原理,因为在开发项目的应用的比较多,比如在处理比较复杂的业务时候,需要遍历来查找数据和操作数据,有些时候还有到数据进行排序等,所以对经常处理业务比较多的童鞋...
  • gyh790005156
  • gyh790005156
  • 2016年11月02日 18:25
  • 2181

Java ArrayList的实现原理详解

ArrayList是Java List类型的集合类中最长使用的,本文基于Java1.8,对于ArrayList的实现原理做一下详细讲解。 一、ArrayList实现原理总结 ArrayList...
  • guoweimelon
  • guoweimelon
  • 2016年03月04日 10:04
  • 1339

Java进阶--深入理解ArrayList实现原理

ArrayList简介ArrayList就是动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了动态的增加和减少元素,实现了Collection和List接口,可以灵活的设置数组的大小。要...
  • u013309870
  • u013309870
  • 2017年05月19日 16:21
  • 313

【数据结构】ArrayList原理及实现学习总结

一、ArrayList介绍ArrayList是一种线性数据结构,它的底层是用数组实现的,相当于动态数组。与Java中的数组相比,它的容量能动态增长。类似于C语言中的动态申请内存,动态增长内存。 当...
  • jianyuerensheng
  • jianyuerensheng
  • 2016年04月19日 18:09
  • 8190

ArrayList的底层实现原理

一、对于ArrayList需要掌握的七点内容 ArrayList的创建:即构造器往ArrayList中添加对象:即add(E)方法获取ArrayList中的单个对象:即get(int index...
  • aizhuyanwei
  • aizhuyanwei
  • 2017年11月09日 20:09
  • 223

自行实现ArrayList(底层结构数组)--Java版

package Collection; /* * 自行实现ArrayList:底层结构数组 * 注意注释部分 * 目的仅为更加了解该结构、编码部分不考虑细节 * */ public class...
  • conatic
  • conatic
  • 2016年07月19日 10:42
  • 1132

ArrayList内部实现

ArrayList是基于数组实现的,可以动态增长,它不是线程安全的,只能用于单线程,在多线程下要使用ArrayList结构,可以使用concurrent并发包下的CopyOnWriteArrayLis...
  • dingji_ping
  • dingji_ping
  • 2016年03月30日 16:00
  • 1187

ArrayList和LinkedList底层实现的区别

1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。     2.对于随机访问get和set,ArrayList优于LinkedList,因为Array...
  • u013673242
  • u013673242
  • 2015年01月29日 15:37
  • 8357

ArrayList的动态扩容的实现

ArrayList可以实现容量的自适应的增加,通过阅读源代码,对这个机制进行一下简单的分析。 首先,ArrayList有一个初始的默认大小,为10.  private static final i...
  • qfycc92
  • qfycc92
  • 2015年04月29日 18:47
  • 6285

C# ArrayList源码剖析

数组是C#中最基础的一种数据类型,一旦初始化之后,容量便已经确定。若想要动态扩充容量,那么集合可以满足这点需求。ArrayList是C#最常用也是最基础的一个动态数组。ArrayList在System...
  • exiaojiu
  • exiaojiu
  • 2016年04月19日 15:29
  • 630
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java ArrayList 的实现原理
举报原因:
原因补充:

(最多只允许输入30个字)