前言

   推荐一位大牛的博客: https://blog.csdn.net/eson_15/article/details/51121833

  我基本都是看的他的源码分析,刚开始如果直接看jdk源码可能有一些晕,难免会中途放弃,建议先根据博客,根据别人分析好的一步一步走,会有恍然大悟的感觉,然后再自己去根据jdk对照着看,最后脱离博客在看一遍。

正文

  • ArrayList简介。

    • ArrayList是可以动态增长和缩减的索引序列,它是基于数组实现的List类。
  • ArrayList源码分析。
    • 属性。

       /**
         默认的数组长度,调用默认的构造方法时,会分配此常量
      * Default initial capacity.
      */
      private static final int DEFAULT_CAPACITY = 10; /**
      空数组对象
      * Shared empty array instance used for empty instances.
      */
      private static final Object[] EMPTY_ELEMENTDATA = {}; /**
      空数组对象
      * Shared empty array instance used for default sized empty instances. We
      * distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when
      * first element is added.
      */
      private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; /**
      元素数组,实际ArrayList的元素就是存放在他这里的。(指定为不可被序列化)
      * The array buffer into which the elements of the ArrayList are stored.
      * The capacity of the ArrayList is the length of this array buffer. Any
      * empty ArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
      * will be expanded to DEFAULT_CAPACITY when the first element is added.
      */
      transient Object[] elementData; // non-private to simplify nested class access /**
      数组元素个数
      * The size of the ArrayList (the number of elements it contains).
      *
      * @serial
      */
      private int size;
    • 构造方法。

      // 默认的构造方法,给数组设置成空数组
      public ArrayList() {
      this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
      } // 提供一个集合作为参数。会把集合中的所有元素复制到数组中
      public ArrayList(Collection<? extends E> c) {
      elementData = c.toArray();
      if ((size = elementData.length) != 0) {
      // c.toArray might (incorrectly) not return Object[] (see 6260652)
      if (elementData.getClass() != Object[].class)
      elementData = Arrays.copyOf(elementData, size, Object[].class);
      } else {
      // replace with empty array.
      this.elementData = EMPTY_ELEMENTDATA;
      }
      } // 提供一个参数,可指定数组的长度
      public ArrayList(int initialCapacity) {
      if (initialCapacity > 0) {
      this.elementData = new Object[initialCapacity];
      } else if (initialCapacity == 0) {
      this.elementData = EMPTY_ELEMENTDATA;
      } else {
      throw new IllegalArgumentException("Illegal Capacity: "+
      initialCapacity);
      }
      }
    • 常用方法。
      //*** 添加元素(在数组的尾部添加) ***
      // 1 先判断是否可以插入到数组(不够会扩容数组)
      // 2 插入元素到数组
      // 3 返回true
      public boolean add(E e) {
      ensureCapacityInternal(size + 1); // Increments modCount!!
      elementData[size++] = e;
      return true;
      } // 判断数组
      // 1 如果目前为空数组,给数组分配默认长度
      // 2 交给这位兄弟处理:ensureExplicitCapacity方法
      private void ensureCapacityInternal(int minCapacity) {
      if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
      minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
      } ensureExplicitCapacity(minCapacity);
      } // 判断目前数组是否需要扩容
      // 1 modCount是对数组 修改的 记录数,每次增或删都会自增
      // 2 判断数组长度是否足够(是否需要扩容)
      // 3 如果需要,交给下一个兄弟:grow方法
      private void ensureExplicitCapacity(int minCapacity) {
      modCount++; // overflow-conscious code
      if (minCapacity - elementData.length > 0)
      grow(minCapacity);
      } // 扩容过程
      // 1 将现在的数组长度oldCapacity 扩容1.5倍
      // 2 如果扩容后的长度newCapacity还小,那就取 minCapacity(理论上不可能)
      // 3 如果扩容后的长度newCapacity超过最大长度,调用hugeCapacity方法处理一下。(取最大长度)
      // 4 开始扩容,废弃老数组,生成新数组,赋值给elementData
      private void grow(int minCapacity) {
      // overflow-conscious code
      int oldCapacity = elementData.length;
      int newCapacity = oldCapacity + (oldCapacity >> 1);
      if (newCapacity - minCapacity < 0)
      newCapacity = minCapacity;
      if (newCapacity - MAX_ARRAY_SIZE > 0)
      newCapacity = hugeCapacity(minCapacity);
      // minCapacity is usually close to size, so this is a win:
      elementData = Arrays.copyOf(elementData, newCapacity);
      } //*** 添加元素(在数组的任意位置添加) ***
      // 1 判断index是否合法
      // 2 判断数组是否需要扩容
      // 3 处理数组(指定位置后面的数组后移)
      // 4 添加元素到指定的位置
      public void add(int index, E element) {
      rangeCheckForAdd(index); ensureCapacityInternal(size + 1); // Increments modCount!!
      System.arraycopy(elementData, index, elementData, index + 1,
      size - index);
      elementData[index] = element;
      size++;
      }

   后面的有时间在分析~~以上个人见解,如有错误之处还望指出!

  

  

JDK源码 - ArrayList的更多相关文章

  1. JDK源码 - ArrayList (基于1.7)

    前言   推荐一位大牛的博客: https://blog.csdn.net/eson_15/article/details/51121833 我基本都是看的他的源码分析,刚开始如果直接看jdk源码可能 ...

  2. JDK源码--ArrayList浅析

    先上别人的源码分析http://www.cnblogs.com/roucheng/p/jdkfenxi.html 这个链接也不错:http://www.jianshu.com/p/8d14b55fa1 ...

  3. JDK源码阅读——ArrayList

    序 如同C语言中字符数组向String过渡一样,作为面向对象语言,自然而然的出现了由Object[]数据形成的集合.本文从JDK源码出发简单探讨一下ArrayList的几个重要方法. Fields / ...

  4. JDK源码看ArrayList和Vector的一些区别

    最近在看JDK源码,从源码的角度记录一下ArrayList和Vector的一些区别 1.new a.不指定长度 Vector默认创建10个元素的数组 public Vector() { this(10 ...

  5. 【jdk源码分析】ArrayList的size()==0和isEmpty()

    先看结果 分析源码 [jdk源码解析]jdk8的ArrayList初始化长度为0 java的基本数据类型默认值 无参构造 size()方法 isEmpty()方法

  6. 一点一点看JDK源码(三)java.util.ArrayList 前偏

    一点一点看JDK源码(三)java.util.ArrayList liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 1.综述 ArrayLi ...

  7. 一点一点看JDK源码(四)java.util.ArrayList 中篇

    一点一点看JDK源码(四)java.util.ArrayList 中篇 liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 1.综述 在前篇中 ...

  8. 一点一点看JDK源码(五)java.util.ArrayList 后篇之forEach

    一点一点看JDK源码(五)java.util.ArrayList 后篇之forEach liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 代 ...

  9. 一点一点看JDK源码(五)java.util.ArrayList 后篇之sort与Comparator

    一点一点看JDK源码(五)java.util.ArrayList 后篇之sort与Comparator liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JD ...

随机推荐

  1. Ubuntu 报错 sudo: unable to resolve host

    Ubuntu 在每次执行命令的时候,会报如下错误: $ sudo sudo: unable to resolve host iZ2zecsdy8flu603bmdg1bZ iZ2zecsdy8flu6 ...

  2. springMVC学习总结(一)快速入门

    springMVC学习总结(一)快速入门 一.初步认识 springMVC执行流程 主要组件 DispatcherServlet(中央控制器) 配置在web.xml中的前端控制器,客户端请求的入口,调 ...

  3. pycharm运行scrapy

    1.打开pycharm, 点击File>Open找到mySpider项目导入 . 2.打开File>Settings>Project 点击Project Interpreter 右边 ...

  4. intellij idea 主题大全,看不惯idea 那2种主题的来这里了

    一直用默认的主题,但是白色的背景看久了会晃眼睛.所以打算换成黑色的. 不过Intellij只有两种主题,Default和Darcula. 现在只能自己手动安装一个了.新主题需要满足, 看久了不会太累. ...

  5. Aop介绍及几种实现方式

    Aop介绍      我们先看一下wiki百科的介绍     Traditional software development focuses on decomposing systems into ...

  6. 老生常谈之Block

    前面有一篇介绍Block的博客,主要介绍了Block的简单使用技巧.这篇博客主要更加深入地了解一下Block.包括:Block的实现.__Block的原理以及Block的存储域三方面. Block的实 ...

  7. Python环境以及编辑器

    1.Python环境搭建 http://blog.csdn.net/qq_29663071/article/details/70158204 备注:a.个人感觉 安装路径为自己选择的 位置和特性 b. ...

  8. Python学习日记day10------函数的命名空间、作用域与闭合函数

    1,参数陷阱 如果默认参数的只是一个可变数据类型,那么每一次调用的时候,如果不传值就共用这个数据类型的资源. 2,三元运算 c=a if a>b else b#如果a>b返回a,否则,返回 ...

  9. 解题思路:house robber i && ii && iii

    这系列题的背景:有个小偷要偷钱,每个屋内都有一定数额的钱,小偷要发家致富在北京买房的话势必要把所有屋子的钱都偷了,但是屋子之内装了警报器,在一定条件下会触发朝阳群众的电话,所以小偷必须聪明一点,才能保 ...

  10. bzoj 2727: [HNOI2012]双十字

    Description 在C 部落,双十字是非常重要的一个部落标志.所谓双十字,如下面两个例子,由两条水平的和一条竖直的"1"线段组成,要求满足以下几个限制: 我们可以找到 5 个 ...