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 ...
随机推荐
- 有关vue中用element ui 中的from表单提交json格式总是有冒号的问题解决办法
因为后台要求要传递JSON格式的数据给他,然后我转了之后总是多了冒号,后来又看了自己的报错,原来是报了404错误,说明路径找不到, 数据格式 后来发现怎么都不行了,然后突然查看了报错报的是404,说明 ...
- LinkedHashMap源码解读
1. 前言 还是从面试中来,到面试中去.面试官在面试 Redis 的时候经常会问到,Redis 的 LRU 是如何实现的?如果让你实现 LRU 算法,你会怎么实现呢?除了用现有的结构 LinkedHa ...
- 将root用户权限赋予普通用户
将root用户权限赋予普通用户 普通用户想要拥有root用户的权限,必须修改/etc/sudoers文件 ,还必须使用visudo命令修改.一是因为这个命令能防止多个用户同时修改这个文件,二是能进行有 ...
- scrapy mid中间件一般处理方法
import user_agent import requests class UA_midd(object): def process_request(self,request,spider): r ...
- 数据结构 5 哈希表/HashMap 、自动扩容、多线程会出现的问题
上一节,我们已经介绍了最重要的B树以及B+树,使用的情况以及区别的内容.当然,本节课,我们将学习重要的一个数据结构.哈希表 哈希表 哈希也常被称作是散列表,为什么要这么称呼呢,散列.散列.其元素分布较 ...
- C语言程序设计(七) 函数
第七章 函数 分而治之: 把较大的任务分解成若干较小.较简单的任务,并提炼出公用任务的方法 函数是C语言中模块化程序设计的最小单位,既可以把每个函数都看作一个模块,也可以将若干相关的函数合并成一个模块 ...
- 深入理解yield from语法
本文目录 为什么要使用协程 yield from的用法详解 为什么要使用yield from . 为什么要使用协程# 在上一篇中,我们从生成器的基本认识与使用,成功过渡到了协程. 但一定有许多人,只知 ...
- C#读取静态类常量属性和值
1.背景最近项目中有一个需求需要从用户输入的值找到该值随对应的名字,由于其它模块已经定义了一份名字到值的一组常量,所以想借用该定义.2.实现实现的思路是采用C#支持的反射.首先,给出静态类中的常量属性 ...
- Redis详解(一)
redis简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多 包括string(字符串).list(链表).set(集合).zset(sor ...
- 两个奇技淫巧,将 Docker 镜像体积减小 99%
原文链接:Docker Images : Part I - Reducing Image Size 对于刚接触容器的人来说,他们很容易被自己构建的 Docker 镜像体积吓到,我只需要一个几 MB 的 ...