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 }
ArrayList源码浅析的更多相关文章
- ArrayList源码浅析(jdk1.8)
ArrayList的实质就是动态数组.所以可以通过下标准确的找到目标元素,因此查找的效率高.但是添加或删除元素会涉及到大量元素的位置移动,所以效率低. 一.构造方法 ArrayList提供了3个构造方 ...
- Java基础—ArrayList源码浅析
注:以下源码均为JDK8的源码 一. 核心属性 基本属性如下: 核心的属性其实是红框中的两个: //从注释也容易看出,一个是集合元素,一个是集合长度(注意是逻辑长度,即元素的个数,而非数组长度) 其中 ...
- java集合: ArrayList源码浅析
ArrayList 是一个动态数组,线程不安全 ,允许元素为null. ArrayList的数据结构是数组,查询比较方便. ArrayList类的接口 public class ArrayList&l ...
- jdk1.7 ArrayList源码浅析
参考:http://www.cnblogs.com/xrq730/p/4989451.html(借鉴的有点多,哈哈) 首先介绍ArrayList的特性: 1.允许元素为空.允许重复元素 2.有序,即插 ...
- Android 手势识别类 ( 三 ) GestureDetector 源码浅析
前言:上 篇介绍了提供手势绘制的视图平台GestureOverlayView,但是在视图平台上绘制出的手势,是需要存储以及在必要的利用时加载取出手势.所 以,用户绘制出的一个完整的手势是需要一定的代码 ...
- 【深入浅出jQuery】源码浅析--整体架构
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
- 【深入浅出jQuery】源码浅析2--奇技淫巧
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
- java8 ArrayList源码阅读
转载自 java8 ArrayList源码阅读 本文基于jdk1.8 JavaCollection库中有三类:List,Queue,Set 其中List,有三个子实现类:ArrayList,Vecto ...
- Struts2源码浅析-ConfigurationProvider
ConfigurationProvider接口 主要完成struts配置文件 加载 注册过程 ConfigurationProvider接口定义 public interface Configurat ...
随机推荐
- 网络流媒体协议的联系与区别(RTP RTCP RTSP RTMP HLS)
目录 网络流媒体协议的联系与区别(RTP RTCP RTSP RTMP HLS) 简结 RTP RTCP RTSP 区别与联系 RTSP.RTMP.HLS 区别与联系 关于直播 流媒体各协议层次图 基 ...
- Python实战之制作瘟疫传播实验
2020年爆发新型冠状病毒,让大家在见证中国的团结也让大家感受到疫情传播的骇人 在这里先道一声“武汉加油.中国加油” 那么现在我们尝试制作一个模拟疫情爆发的模型,以数字的形式展现疫情爆发点恐怖. (1 ...
- RNN学习笔记(一):长短时记忆网络(LSTM)
一.前言 在图像处理领域,卷积神经网络(Convolution Nerual Network,CNN)凭借其强大的性能取得了广泛的应用.作为一种前馈网络,CNN中各输入之间是相互独立的,每层神经元的信 ...
- Markdown使用说明
# Markdown 使用说明 Markdown 是一种**轻量级标记语言** 使用规则: 1. 标题 2. 列表 3. 引用 4. 图片与链接 5. 粗体与斜体 6.表格 7. 代码框 8. 分 ...
- deepin15.11安装N卡驱动,实测!!!(可解决N卡电脑关机卡屏)
前言:deepin(深度)是一款由武汉深之度公司研发的一款适合国人日常学习的linux系统,其UI精美,美过Mac.它对于中国用户的一个亮点就是QQ微信等国软件傻瓜式安装(类似安卓应用商店安装),如果 ...
- 【Vue】---- 手动封装on,emit,off
一.概念 1. $on("事件名称",回调函数) 事件绑定,一个事件名称上面可能绑定多个函数 2. $emit("事件名称",需要传递的值) 事件触发时,会触发 ...
- MySQL中SQL Mode的查看与设置
MySQL可以运行在不同的模式下,而且可以在不同的场景下运行不同的模式,这主要取决于系统变量 sql_mode 的值.本文主要介绍一下这个值的查看与设置,主要在Mac系统下. 对于每个模式的意义和作用 ...
- scrapy全栈抓xpc练习
# spider文件 # -*- coding: utf-8 -*- import scrapy import re from scrapy import Request import json im ...
- 数据挖掘入门系列教程(四点五)之Apriori算法
目录 数据挖掘入门系列教程(四点五)之Apriori算法 频繁(项集)数据的评判标准 Apriori 算法流程 结尾 数据挖掘入门系列教程(四点五)之Apriori算法 Apriori(先验)算法关联 ...
- Excel 电子表格中,快速修改表格中的数值
打开设置单元格设置选项后,当前界面,分类下面的选项中,选择“自定义”,并在右侧展示的“类型(T)”下方的对话框中,输入以下代码: [=1]√;[=2]×; 并按确认, [=1] 意思为: 将单元格中, ...