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

  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 }

ArrayList源码浅析的更多相关文章

  1. ArrayList源码浅析(jdk1.8)

    ArrayList的实质就是动态数组.所以可以通过下标准确的找到目标元素,因此查找的效率高.但是添加或删除元素会涉及到大量元素的位置移动,所以效率低. 一.构造方法 ArrayList提供了3个构造方 ...

  2. Java基础—ArrayList源码浅析

    注:以下源码均为JDK8的源码 一. 核心属性 基本属性如下: 核心的属性其实是红框中的两个: //从注释也容易看出,一个是集合元素,一个是集合长度(注意是逻辑长度,即元素的个数,而非数组长度) 其中 ...

  3. java集合: ArrayList源码浅析

    ArrayList 是一个动态数组,线程不安全 ,允许元素为null. ArrayList的数据结构是数组,查询比较方便. ArrayList类的接口 public class ArrayList&l ...

  4. jdk1.7 ArrayList源码浅析

    参考:http://www.cnblogs.com/xrq730/p/4989451.html(借鉴的有点多,哈哈) 首先介绍ArrayList的特性: 1.允许元素为空.允许重复元素 2.有序,即插 ...

  5. Android 手势识别类 ( 三 ) GestureDetector 源码浅析

    前言:上 篇介绍了提供手势绘制的视图平台GestureOverlayView,但是在视图平台上绘制出的手势,是需要存储以及在必要的利用时加载取出手势.所 以,用户绘制出的一个完整的手势是需要一定的代码 ...

  6. 【深入浅出jQuery】源码浅析--整体架构

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  7. 【深入浅出jQuery】源码浅析2--奇技淫巧

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  8. java8 ArrayList源码阅读

    转载自 java8 ArrayList源码阅读 本文基于jdk1.8 JavaCollection库中有三类:List,Queue,Set 其中List,有三个子实现类:ArrayList,Vecto ...

  9. Struts2源码浅析-ConfigurationProvider

    ConfigurationProvider接口 主要完成struts配置文件 加载 注册过程 ConfigurationProvider接口定义 public interface Configurat ...

随机推荐

  1. redis系列之------过期策略

    前言 我们都知道redis是常驻在内存当中的,因此他的效率比MySQL要快很多很多.但又引发了另外一个问题,内存从本质上讲,它是昂贵的,不能用于大量的长时间的存储,他是“不安全不稳定的“,并且有可能存 ...

  2. Yuchuan_Linux_C编程之二 GCC编译

    一.整体大纲  二.gcc编译的四个阶段

  3. hadoop HDFS完全分布式搭建

    1.准备阶段 准备好两台虚拟机(安装好hadoop,见:https://www.cnblogs.com/cjq10029/p/12336446.html),计划: IP 主机名 192.168.3.7 ...

  4. python初学者必看学习路线图!!!

    python应该是近几年比较火的语言之一,很多人刚学python不知道该如何学习,尤其是没有编程基础想要从事程序员工作的小白,想必应该都会有此疑惑,包括我刚学python的时候也是通过从网上查找相关资 ...

  5. 高可用Keepalived+LVS搭建流程

    本流程搭建1个master,1个backup节点的Keepalived,使用lvs轮询2个节点的服务. 一.使用版本 CentOS 7.7 Keepalived 1.3.5 ipvsadm 1.27( ...

  6. AspNetCore3.1_Middleware源码解析_3_HttpsRedirection

    概述 上文提到3.1版本默认没有使用Hsts,但是使用了这个中间件.看名字就很好理解,https跳转,顾名思义,就是跳转到 https地址. 使用场景,当用户使用http访问网站时,自动跳转到http ...

  7. css 实现九宫格

    1.自己写了一个,写完对比了下别人写的发现自己写的太low.故就不写自己太差劲的了. 别人写的我总结优化了一下,如果不用写内容去掉position,content简单也是可以的. <!DOCTY ...

  8. 基于 HTML5 WebGL 的发动机 3D 可视化系统

    前言     工业机械产品大多体积庞大.运输成本高,在参加行业展会或向海外客户销售时,如果没有实物展示,仅凭静态.简单的图片说明书介绍,无法让客户全面了解产品,不仅工作人员制作麻烦,客户看得也费力.如 ...

  9. 两个div,高度都是100% 用 display:flex; 和 min-height 一边撑高了,另一边自动走 (不加flex不自动撑开)

    两个div,高度都是100% 用 display:flex; 和 min-height 一边撑高了,另一边自动走

  10. JavaScript 原型与继承

    JavaScript 原型与继承 JavaScript 中函数原型是实现继承的基础.prototype.construct.原型链以及基于原型链的继承是面向对象的重要内容 prototype 原型即 ...