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

  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. 网络流媒体协议的联系与区别(RTP RTCP RTSP RTMP HLS)

    目录 网络流媒体协议的联系与区别(RTP RTCP RTSP RTMP HLS) 简结 RTP RTCP RTSP 区别与联系 RTSP.RTMP.HLS 区别与联系 关于直播 流媒体各协议层次图 基 ...

  2. Python实战之制作瘟疫传播实验

    2020年爆发新型冠状病毒,让大家在见证中国的团结也让大家感受到疫情传播的骇人 在这里先道一声“武汉加油.中国加油” 那么现在我们尝试制作一个模拟疫情爆发的模型,以数字的形式展现疫情爆发点恐怖. (1 ...

  3. RNN学习笔记(一):长短时记忆网络(LSTM)

    一.前言 在图像处理领域,卷积神经网络(Convolution Nerual Network,CNN)凭借其强大的性能取得了广泛的应用.作为一种前馈网络,CNN中各输入之间是相互独立的,每层神经元的信 ...

  4. Markdown使用说明

    # Markdown 使用说明 Markdown 是一种**轻量级标记语言** 使用规则: 1. 标题   2. 列表 3. 引用 4. 图片与链接 5. 粗体与斜体 6.表格 7. 代码框 8. 分 ...

  5. deepin15.11安装N卡驱动,实测!!!(可解决N卡电脑关机卡屏)

    前言:deepin(深度)是一款由武汉深之度公司研发的一款适合国人日常学习的linux系统,其UI精美,美过Mac.它对于中国用户的一个亮点就是QQ微信等国软件傻瓜式安装(类似安卓应用商店安装),如果 ...

  6. 【Vue】---- 手动封装on,emit,off

    一.概念 1. $on("事件名称",回调函数) 事件绑定,一个事件名称上面可能绑定多个函数 2. $emit("事件名称",需要传递的值) 事件触发时,会触发 ...

  7. MySQL中SQL Mode的查看与设置

    MySQL可以运行在不同的模式下,而且可以在不同的场景下运行不同的模式,这主要取决于系统变量 sql_mode 的值.本文主要介绍一下这个值的查看与设置,主要在Mac系统下. 对于每个模式的意义和作用 ...

  8. scrapy全栈抓xpc练习

    # spider文件 # -*- coding: utf-8 -*- import scrapy import re from scrapy import Request import json im ...

  9. 数据挖掘入门系列教程(四点五)之Apriori算法

    目录 数据挖掘入门系列教程(四点五)之Apriori算法 频繁(项集)数据的评判标准 Apriori 算法流程 结尾 数据挖掘入门系列教程(四点五)之Apriori算法 Apriori(先验)算法关联 ...

  10. Excel 电子表格中,快速修改表格中的数值

    打开设置单元格设置选项后,当前界面,分类下面的选项中,选择“自定义”,并在右侧展示的“类型(T)”下方的对话框中,输入以下代码: [=1]√;[=2]×; 并按确认, [=1] 意思为: 将单元格中, ...