java arraylist底层实现原理_ArrayList的底层实现原理
//elementData中已存放的元素的个数,注意:不是elementData的容量
private intsize;//elementData的默认容量为10
private static final int DEFAULT_CAPACITY = 10;//对象数组:ArrayList的底层数据结构,transient表示该字段不进行序列化操作
transientObject[] elementData;//实例化一个空数组
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA ={};//实例化一个空数组
private static final Object[] EMPTY_ELEMENTDATA ={};protected transient int modCount = 0;
@Nativepublic static final int MAX_VALUE = 0x7fffffff;private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;/*** 向elementData末尾中添加元素
*/
public booleanadd(E e) {//确保对象数组elementData有足够的容量,可以将新加入的元素e加进去
ensureCapacityInternal(size + 1);//加入新元素e,size加1
elementData[size++] =e;return true;
}//minCapacity = seize+1,即表示执行完添加操作后,数组中的元素个数
private void ensureCapacityInternal(intminCapacity) {//判断是否是空数组
if (elementData ==DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {//用最小容量和10进行比较,取最大值赋值给最小容量
minCapacity =Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}/***确保数组的容量足够存放新加入的元素,若不够,要扩容
*/
private void ensureExplicitCapacity(intminCapacity) {
modCount++;//如果数组个数minCapacity (size+1)大于数组长度就需要进行扩容
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}private void grow(intminCapacity) {int oldCapacity =elementData.length;//将旧的数组容量增加为原来的1.5倍作为新的容量
int newCapacity = oldCapacity + (oldCapacity >> 1);//如果新的容量小于数组个数,将数组个数赋值给新容量
if (newCapacity - minCapacity < 0)
newCapacity=minCapacity;//如果新的容量大于最大容量,就根据数组个数来决定新的容量大小
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity=hugeCapacity(minCapacity);//根据新的容量,将数组拷贝到新的数组并赋值给数组
elementData =Arrays.copyOf(elementData, newCapacity);
}private static int hugeCapacity(intminCapacity) {//如果数组个数小于0抛出OutOfMemoryError异常
if (minCapacity < 0) //overflow
throw newOutOfMemoryError();//如果最数组个数大于最大容量 就返回最大值,否则返回最大容量
return (minCapacity > MAX_ARRAY_SIZE) ?Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}/*** 向elementData指定位置添加元素
*/
public void add(intindex, E element) {//指定位置检查
rangeCheckForAdd(index);//扩容检查
ensureCapacityInternal(size + 1); //Increments modCount!!//通过拷贝使数组内位置为 index 到 (size-1)的元素往后移动一位
System.arraycopy(elementData, index, elementData, index + 1,
size-index);//找到位置添加元素
elementData[index] =element;//元素个数加一
size++;
}//判断指定位置是否超出数组个数
private void rangeCheckForAdd(intindex) {if (index > size || index < 0)throw newIndexOutOfBoundsException(outOfBoundsMsg(index));
}/***@paramsrc 原数组.
*@paramsrcPos 原数组的起始位置.
*@paramdest 目标数组.
*@paramdestPos 目标数组的起始位置.
*@paramlength 拷贝长度.
*/
public static native void arraycopy(Object src, intsrcPos,
Object dest,intdestPos,int length);
java arraylist底层实现原理_ArrayList的底层实现原理相关推荐
- java底层原理书籍_阿里面试题:Java中this和super关键字的底层实现原理
知道的越多,不知道的就越多,业余的像一棵小草! 编辑:业余草 来源:https://www.xttblog.com/?p=5028 B 站:业余草 最近一个粉丝加我说,接到了阿里的面试,问问我阿里会面 ...
- 牛客网Java刷题知识点之ArrayList 、LinkedList 、Vector 的底层实现和区别
不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...
- Java中Set集合的使用和底层原理
文章目录 Set系列集合介绍 Set集合概述 HashSet无序原理 Set集合对象去重 LinkedHashSet TreeSet排序规则 Set系列集合介绍 Set集合概述 Set系列集合特点: ...
- Java ArrayList的实现原理详解
ArrayList是Java List类型的集合类中最常使用的,本文基于Java1.8,对于ArrayList的实现原理做一下详细讲解. (Java1.8源码:http://docs.oracle.c ...
- 深入浅出学习透析Nginx服务器的架构分析及原理分析「底层技术原理+运作架构机制」
Nginx再次回顾 也许你已经忘记了Nginx是做什么的?我来再次给你夯实一下概念. 多协议反向代理 Nginx是个高性能的Web和反向代理服务器及HTTP服务器,它能反向代理HTTP,HTTPS和邮 ...
- 三、redis原理之list底层数据结构
一.redis原理之list底层数据结构ziplist和quicklist. 快速列表 quicklist[quicklist = 链表+ziplist] 首先在列表元素较少的情况下会使用一块连续的内 ...
- 四、redis原理之set底层数据结构
一.redis原理之set底层数据结构? 其底层有两种实现方式: 1.当value是整数值时,且数据量不大时使用inset来存储, 2.其他情况都是用字典dict来存储 inset的结构: typed ...
- java arraylist排序_最全Java集合笔记
集合概述 什么是集合 集合框架:用于存储数据的容器. 集合框架是为表示和操作集合而规定的一种统一的标准的体系结构.任何集合框架都包含三大块内容:对外的接口.接口的实现和对集合运算的算法. 接口:表示集 ...
- java arraylist 方法返回值_返回arraylist方法
ArrayList 什么是ArrayList 可以简单的认为是一个动态数组:实际上ArrayList就是用数组实现的,长度不够时,调用Arrays.copyOf方法,拷贝当前数组到一个新的长度更大的数 ...
最新文章
- 深证信息等三方拟联合开展大数据研究
- 关于深度学习的小知识点
- 【模拟】P1424 小鱼的航程(改进版)
- 有了这套模板,女朋友再也不用担心我刷不动 LeetCode 了
- 第一百四十五节,JavaScript,同步动画
- 经验 | 清华大学计算机系教授~浅谈研究生学位论文选题方法
- 2017.3.6 地精部落 思考记录
- linux内核串口调试,linux 串口调试方法
- 顺序右移数组元素(内测第0届第5题)
- MPU6050六轴传感器的原理及编程说明
- 2016最新PHP燕十八系统实战入门网站视频教程
- Ubuntu中报错:failed to create hard link
- Win10文件无法重命名
- uva 563	Crimewave
- 华为3Com孤单上路
- HIT CSAPP大作业--程序人生
- MySQL数据完整性约束
- Exchange Server2010系列之六:监控用户邮件
- Dubbo (二) ---------- Dubbo 框架
- 使用laravel开发微信公众的一个大坑,适合新手学习的laravel接入微信接口