ArrayList源码浅析

这里只理解主要的常用方法:

  1 public class ArrayList<E> extends AbstractList<E>
  2         implements List<E>, RandomAccess, Cloneable, java.io.Serializable
  3 {
  4     private static final long serialVersionUID = 8683452581122892189L;
  5
  6     /**
  7      * 默认的初始化数组容量为10
  8      */
  9     private static final int DEFAULT_CAPACITY = 10;
 10
 11     /**
 12      * 为空实例使用的共享空数组实例
 13      */
 14     private static final Object[] EMPTY_ELEMENTDATA = {};
 15
 16   //用来和EMPTY_ELEMENTDATA区分,EMPTY_ELEMENTDATA是指定容量为0时的,DEFAULTCAPACITY_EMPTY_ELEMENTDATA是没有指定容量时的数组
 17
 18   private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
 19
 20   /**
 21      * 数组缓冲区存放的是ArrayList存储的内容,ArrayList的容量是数组缓冲区的长度,
 22      * 当第一次添加元素时如果为空DEFAULTCAPACITY_EMPTY_ELEMENTDATA,容量会被扩展为DEFAULT_CAPACITY;
 23      */
 24     transient Object[] elementData;
 25
 26   //指定容量
 27
 28    public ArrayList(int initialCapacity) {
 29         if (initialCapacity > 0) {
 30             this.elementData = new Object[initialCapacity];
 31         } else if (initialCapacity == 0) {
 32             this.elementData = EMPTY_ELEMENTDATA;
 33         } else {
 34             throw new IllegalArgumentException("Illegal Capacity: "+
 35                                                initialCapacity);
 36         }
 37     }
 38
 39   //不指定容量
 40
 41   public ArrayList() {
 42         this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
 43     }
 44
 45   /**
 46      * 添加数据到list的末尾
 47      *
 48      * @param e element to be appended to this list
 49      * @return <tt>true</tt> (as specified by {@link Collection#add})
 50      */
 51     public boolean add(E e) {
 52         ensureCapacityInternal(size + 1);  // Increments modCount!!
 53         elementData[size++] = e;
 54         return true;
 55     }
 56
 57   //如果出是数组为空并且是第一次添加数据,设置数组容量为默认容量10
 58
 59 private void ensureCapacityInternal(int minCapacity) {
 60         if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
 61             minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
 62         }
 63
 64         ensureExplicitCapacity(minCapacity);
 65     }
 66
 67   //设置容量增长算法
 68
 69 private void ensureExplicitCapacity(int minCapacity) {
 70         modCount++;
 71
 72         // overflow-conscious code
 73         if (minCapacity - elementData.length > 0)
 74             grow(minCapacity);
 75     }
 76
 77    /**
 78      * 增加容量确保能够容纳至少为给定的最小容量
 79      *
 80      * @param 需要的最小容量
 81      */
 82     private void grow(int minCapacity) {
 83         // overflow-conscious code
 84         int oldCapacity = elementData.length;
 85
 86   //设置新的容量为原来的1.5倍
 87         int newCapacity = oldCapacity + (oldCapacity >> 1);
 88
 89     //这种情况对应没有指定容量时,添加数据小于默认容量
 90         if (newCapacity - minCapacity < 0)
 91             newCapacity = minCapacity;
 92
 93     //容量不能超过指定的最大容量Integer.MAX_VALUE - 8;
 94         if (newCapacity - MAX_ARRAY_SIZE > 0)
 95             newCapacity = hugeCapacity(minCapacity);
 96         // minCapacity is usually close to size, so this is a win:
 97
 98   //复制新的数组到原来的数组中
 99         elementData = Arrays.copyOf(elementData, newCapacity);
100     }
101
102 }
时间: 2024-10-21 02:02:04

ArrayList源码浅析的相关文章

ArrayList源码浅析(jdk1.8)

ArrayList的实质就是动态数组.所以可以通过下标准确的找到目标元素,因此查找的效率高.但是添加或删除元素会涉及到大量元素的位置移动,所以效率低. 一.构造方法 ArrayList提供了3个构造方法 1.无参的,就是把表示集合的数组赋值为空. public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; } 2.带初始化大小的构造方法,就是new一个指定大小的数组赋值给表示集合的数组. public Ar

java ArrayList 源码浅析

学习的东西越多就会发现自己越无知,最近看各种大牛的博客之类,深觉自己的无知啊,瀑布汗...摆正心态,慢慢学习,希望勤能补拙了. ArrayList算是Java集合框架中相对简单的一个了,学习数据结构的时候很多人也会选择去自己实现一个类似功能的数组的线性存储,其实ArrayList也是如此,只是其开发人员写的更加正规一些,下面就看下源码去看下他们的思路. 1. 定义 public class ArrayList<E> extends AbstractList<E> implement

jdk1.7 ArrayList源码浅析

参考:http://www.cnblogs.com/xrq730/p/4989451.html(借鉴的有点多,哈哈) 首先介绍ArrayList的特性: 1.允许元素为空.允许重复元素 2.有序,即插入顺序和访问顺序一致 3.非同步 ArrayList实现原理为动态数组 首先看构造方法: public ArrayList(int initialCapacity) { super(); if (initialCapacity < 0) throw new IllegalArgumentExcept

Gradle 庖丁解牛(构建源头源码浅析)

1 背景 陆陆续续一年多,总是有人问 Gradle 构建,总是发现很多人用 Gradle 是迷糊状态的,于是最近准备来一个"Gradle 庖丁解牛"系列,一方面作为自己的总结,一方面希望真的能达到标题所示效果,同时希望通过该系列达到珍惜彼此时间的目的,因为目前市面上关于 Gradle 的教程都是在教怎么配置和怎么编写插件,很少有说明 Gradle 自己到底是个啥玩意的,还有是如何工作的,本系列以官方 release 3.4 版本为基础. 废话不多说,标题也表明了本篇所总结的内容 --

Android应用Loaders全面详解及源码浅析

1 背景 在Android中任何耗时的操作都不能放在UI主线程中,所以耗时的操作都需要使用异步实现.同样的,在ContentProvider中也可能存在耗时操作,这时也该使用异步操作,而3.0之后最推荐的异步操作就是Loader.它可以方便我们在Activity和Fragment中异步加载数据,而不是用线程或AsyncTask,他的优点如下: 提供异步加载数据机制: 对数据源变化进行监听,实时更新数据: 在Activity配置发生变化(如横竖屏切换)时不用重复加载数据: 适用于任何Activit

Volley框架源码浅析(一)

尊重原创http://blog.csdn.net/yuanzeyao/article/details/25837897 从今天开始,我打算为大家呈现关于Volley框架的源码分析的文章,Volley框架是Google在2013年发布的,主要用于实现频繁而且粒度比较细小的Http请求,在此之前Android中进行Http请求通常是使用HttpUrlConnection和HttpClient进行,但是使用起来非常麻烦,而且效率比较地下,我想谷歌正式基于此种原因发布了Volley框架,其实出了Voll

PM2源码浅析

PM2工作原理 最近在玩一个游戏,<地平线:黎明时分>,最终Boss是一名叫黑底斯的人,所谓为人,也许不对,黑底斯是一段强大的毁灭进程,破坏了盖娅主进程,从而引发的整个大陆机械兽劣化故事. 为什么要讲这么一段呢,是希望大家可以更好地理解pm2的原理,要理解pm2就要理解god和santan的关系,god和santan的关系就相当于盖娅和黑底斯在pm2中的01世界中,每一行代码每一个字节都安静的工作god就是Daemon进程 守护进程,重启进程,守护node程序世界的安宁,santan就是进程的

Android源码浅析(一)——VMware Workstation Pro和Ubuntu Kylin 16.04 LTS安装配置

Android源码浅析(一)--VMware Workstation Pro和Ubuntu Kylin 16.04 LTS安装配置 最近地方工作,就是接触源码的东西了,所以好东西还是要分享,系列开了这么多,完结 的也没几个,主要还是自己覆盖的太广了,却又不精通,嘿嘿,工作需要,所以写下了本篇博客 一.VMware 12 我选择的虚拟机试VMware,挺好用的感觉,下载VMware就不说了,善用搜索键嘛,这里我提供一个我现在在用的 下载地址:链接:http://pan.baidu.com/s/1k

ReactiveCocoa2 源码浅析

ReactiveCocoa2 源码浅析 标签(空格分隔): ReactiveCocoa iOS Objective-C ? 开车不需要知道离合器是怎么工作的,但如果知道离合器原理,那么车子可以开得更平稳. ReactiveCocoa 是一个重型的 FRP 框架,内容十分丰富,它使用了大量内建的 block,这使得其有强大的功能的同时,内部源码也比较复杂.本文研究的版本是2.4.4,小版本间的差别不是太大,无需担心此问题. 这里只探究其核心 RACSignal 源码及其相关部分.本文不会详细解释里