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 ...
随机推荐
- 一起了解 .Net Foundation 项目 No.15
.Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. NUnit Test Fr ...
- Centos 安装rabbitmq
此处是通过源码进行安装的rabbitmq,参考:http://www.cnblogs.com/huangxincheng/p/6006569.html 1.源码包下载 ① erlang : http: ...
- React的路由react-router
意思是:当你写一个web应用时候,应噶install的是react-router-dom,同样的,当你想写一个Native应用时候,需要install的是react-router-native,这两个 ...
- 通过mockjs来制作假数据
需用用到的模块为express和mockjs //导入模块开启服务器模块 const express=require('express') //导入假数据模块 const mockjs=require ...
- python 关于函数递归调用自己
爬取b站博人传 每页短评20个,页数超过1000页, 代码如下 import requests import json import csv def main(start_url): headers ...
- BERT实现QA中的问句语义相似度计算
1. BERT 语义相似度 BERT的全称是Bidirectional Encoder Representation from Transformers,是Google2018年提出的预训练模型,即双 ...
- 解决 unable to lock the administration directory (/var/lib/dpkg/) 问题
阿里开源镜像站提供了raspbian的软件包镜像,国内的用户可以选择改用阿里镜像站作为更新源. 但是在更换源之后,执行 sudo apt-get update && apt-get u ...
- 《JavaScript 模式》读书笔记(2)— 基本技巧2
前一篇,简单介绍了一些js代码的基本技巧.那么这篇文章,我们继续后续的内容. 一.for循环 for循环经常用在遍历数组或者类数组对象,如引数(arguments)和HTML容器(HTMLCollti ...
- (转)解决windows live writer的段首缩进问题
原文地址:http://blog.csdn.net/xiao_wanpeng/article/details/6381799 Windows live writer 默认是没有段首缩进的,并且不能修改 ...
- dom4j解析xml格式文件实例
以下给4种常见的xml文件的解析方式的分析对比: DOM DOM4J JDOM SAX Dom解析 在内存中创建一个DOM树,该结构通常需要加载整个文档然后才能做工作.由于它是基于信息层次 ...