ArrayList知识详解
简介
ArrayList是Java集合常用的数据结构之一,继承自AbstractList,实现了List,RandomAccess、Cloneable、Serializable等一系列接口,支持快速访问,复制和序列化。底层是基于数组实现容量大小动态变化,允许null值存在。
部分源码分析
ArrayList的底层是由数组实现

默认size的初始大小为10:

ArrayList定义了两个类常量数组:EMPTY_ELEMENTDATA(EE)和DEFAULTCAPACITY_EMPTY_ELEMENTDATA(DEE)
注释:EE,用于ArrayList空实例的共享空数组实例
DEE,用于默认大小空实例的共享空数组实例,将EE和DEE区分开,以便在添加第一个元素时知道要增加多少

三个构造函数,包括一个无参构造和两个有参构造:



注:无参构造创建的实例是DEFAULTCAPACITY_EMPTY_ELEMENTDATA,有参构造创建的实例是EMPTY_ELEMENTDATA
然后是add( )方法:

当第一次调用add(E e)方法时,判断是不是无参构造方法创建的对象,如果是,则将DEFAULT_CAPACITY作为ArrayLiat的容量,此时minCapacity = 1

还有其他add方法例如:
addAll( Collection<? extends E> c )
add( int index, E element )

等等....这些方法中都包含ensureCapacitylnternal( int Capacity )方法,确保无参构造在创建实例并添加第一个元素时,最小的容量是默认大小10。
而有参构造创建空实例后,在add( E e )方法添加元素扩容情况是这样的:
新容量为旧容量的1.5倍

在Java7中,ArrayList的构造方法只有EMPTY_ELEMENTDATA即EE, 而Java8中DEE代替了EE,但是原来的EE还存在,只是作用改变了:

当容量为0时,会创建一个空数组,赋值给elementData,当一个应用中有很多这样的ArrayList空实例时,就会有很多空数组,这样使用EMPTY_ELEMENTDATA就是为了优化性能,所有的ArrayList空实例都指向同一个数组。而DEE(DEFAULTCAPACITY_EMPTY_ELEMENTDATA)就是为了保证无参构造方法常见的实例在添加第一个元素时,最小的容量是默认的10.
ArrayList的扩容
以无参构造为例:
首先无参构造初以默认大小来始化内部数组

然后是扩容,使用add( )方法

ensureCapacityInternal方法中的size代表执行添加前的元素个数,通过现有的元素个数数组的容量进行对比,若需要扩容则扩容。
ensureCapacityInternal(size + 1)就是将要添加的额元素放入数组中
扩容条件:若数组的长度eleentData的长度小于做小需要的容量minCapacity,就需要扩容

扩容逻辑:

注:
1. >>位运算,右移一位代表oldCapacity / 2,位运算效率更高
2. JDK7后增加对元素个数的最大个数判断,MAX_ARRAY_SIZE为int最大值减去8
3. 复制元素方法扩容。使用延迟分配对象数组空间,当数组加满数组容量后才会按照1.5倍扩容。
ArrayList的remove( int index )方法

当我们调用remove( int index )时,首先调用rangrCheck( ) 方法检查index是否合法,再判断要删除的元素是否位于数组的最后一个位置。
当index是最后一个,则直接将数组的最后一个位置置空,即size-1即可;
当index不是最后一个,调用System.arraycopy( )方法复制数组,将从index+1开始,所有元素都往前挪一个位置,再将数组最后一个位置置空。
ArrayList知识详解的更多相关文章
- RabbitMQ基础知识详解
什么是MQ? MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取队列中 ...
- Cisco路由技术基础知识详解
第一部分 请写出568A的线序(接触网络第一天就应该会的,只要你掐过,想都能想出来) .网卡MAC地址长度是( )个二进制位(16进制与2进制的换算关系,只是换种方式问,不用你拿笔去算) A.12 ...
- L009文件属性知识详解小节
本堂课分为5部分内容 1.linux下重要目录详解 2.PATH变量路径内容 3.linux系统中文件类型介绍 4.linux系统中文件属性详细介绍 5.linux系统文件属性inode与block知 ...
- RabbitMQ,Apache的ActiveMQ,阿里RocketMQ,Kafka,ZeroMQ,MetaMQ,Redis也可实现消息队列,RabbitMQ的应用场景以及基本原理介绍,RabbitMQ基础知识详解,RabbitMQ布曙
消息队列及常见消息队列介绍 2017-10-10 09:35操作系统/客户端/人脸识别 一.消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以 ...
- 浏览器对象模型(BOM)是什么?(体系结构+知识详解)(图片:结构)
浏览器对象模型(BOM)是什么?(体系结构+知识详解)(图片:结构) 一.总结 1.BOM操作所有和浏览器相关的东西:网页文档dom,历史记录,浏览器屏幕,浏览器信息,文档的地址url,页面的框架集. ...
- Intent知识详解
Intent知识详解 一.什么是Intent 贴一个官方解释: An intent is an abstract description of an operation to be performed ...
- Context知识详解
Context知识详解 建议配合context知识架构图食用. 一.什么是Context 贴一个官方解释: Interface to global information about an appli ...
- Python字符串切片操作知识详解
Python字符串切片操作知识详解 这篇文章主要介绍了Python中字符串切片操作 的相关资料,需要的朋友可以参考下 一:取字符串中第几个字符 print "Hello"[0] 表 ...
- Python基础知识详解 从入门到精通(七)类与对象
本篇主要是介绍python,内容可先看目录其他基础知识详解,欢迎查看本人的其他文章Python基础知识详解 从入门到精通(一)介绍Python基础知识详解 从入门到精通(二)基础Python基础知识详 ...
随机推荐
- centos6 yum安装mysql 5.6 (完整版)
使用源代码编译安装mysql还是比较麻烦,一般来说设备安装时请网络同事临时开通linux上网,通过yum网络实现快速安装,或配置yum仓库进行内网统一安装. 通过网络快速安装过程如下 一.检查系统是否 ...
- track-by的使用
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 《Java编程思想》读书笔记<一>
第二章 一切皆对象 java是面向对象的语言. 1.我们怎么操作对象? 每种语言都有自己的操纵内存中元素的方式,java使用引用操作内存中元素(对象).引用可以独立存在,例如:String s:表示创 ...
- Javadoc常见的标记和含义
1.@param 方法参数的说明 2.@return 对 方法返回值的说明 3.@throws 方法抛出异常的描述 4.@version模块的版本号 5.see参数转向 6.@deprecated标记 ...
- python-静态方法和类方法及其使用场景
静态方法和类方法 静态方法 我们在类中定义的方法都是对象方法,也就是说这些方法都是发送给对象的消息.实际上,我们写在类中的方法并不需要都是对象方法,例如我们定义一个"三角形"类,通 ...
- 阶段3 2.Spring_07.银行转账案例_3 分析事务的问题并编写ConnectionUtils
不是没有事务造成的 这样相当于有四个connection 每一个都有自己独立的事物 每一个自己成功就提交事务. 已经提交的就执行结束.没有提交的就报异常 让这些操作使用同一个connection 事物 ...
- Elasticsearch 为何要在 7.X版本中 去除type 的概念
背景说明 Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎.无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进.性能最好的.功能最全的搜索引擎库. El ...
- 获取重复字符串的range,设置attributedText
之前项目的需求是未读人员显示绿色,已读人员显示黑色,测试今天提bug说存在未读人员显示的黑色...这就尴尬了,我完全不知道为啥,经过打断点调试程序,终于找到问题:就是他只会获取到第一个想等字符的ran ...
- os, sys, stat 模块使用
1.设置文件权限: 注意:设置权限之前要导入下面三个模块,否则报错, import os, sys, stat os.chmod("/home/a.txt", stat.S_IXG ...
- MariaDB 连接查询,视图,事物,索引,外键
1.连接查询 --创建学生表 create table students ( id int unsigned not null auto_increment primary key, name var ...