//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的底层实现原理相关推荐

  1. java底层原理书籍_阿里面试题:Java中this和super关键字的底层实现原理

    知道的越多,不知道的就越多,业余的像一棵小草! 编辑:业余草 来源:https://www.xttblog.com/?p=5028 B 站:业余草 最近一个粉丝加我说,接到了阿里的面试,问问我阿里会面 ...

  2. 牛客网Java刷题知识点之ArrayList 、LinkedList 、Vector 的底层实现和区别

    不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...

  3. Java中Set集合的使用和底层原理

    文章目录 Set系列集合介绍 Set集合概述 HashSet无序原理 Set集合对象去重 LinkedHashSet TreeSet排序规则 Set系列集合介绍 Set集合概述 Set系列集合特点: ...

  4. Java ArrayList的实现原理详解

    ArrayList是Java List类型的集合类中最常使用的,本文基于Java1.8,对于ArrayList的实现原理做一下详细讲解. (Java1.8源码:http://docs.oracle.c ...

  5. 深入浅出学习透析Nginx服务器的架构分析及原理分析「底层技术原理+运作架构机制」

    Nginx再次回顾 也许你已经忘记了Nginx是做什么的?我来再次给你夯实一下概念. 多协议反向代理 Nginx是个高性能的Web和反向代理服务器及HTTP服务器,它能反向代理HTTP,HTTPS和邮 ...

  6. 三、redis原理之list底层数据结构

    一.redis原理之list底层数据结构ziplist和quicklist. 快速列表 quicklist[quicklist = 链表+ziplist] 首先在列表元素较少的情况下会使用一块连续的内 ...

  7. 四、redis原理之set底层数据结构

    一.redis原理之set底层数据结构? 其底层有两种实现方式: 1.当value是整数值时,且数据量不大时使用inset来存储, 2.其他情况都是用字典dict来存储 inset的结构: typed ...

  8. java arraylist排序_最全Java集合笔记

    集合概述 什么是集合 集合框架:用于存储数据的容器. 集合框架是为表示和操作集合而规定的一种统一的标准的体系结构.任何集合框架都包含三大块内容:对外的接口.接口的实现和对集合运算的算法. 接口:表示集 ...

  9. java arraylist 方法返回值_返回arraylist方法

    ArrayList 什么是ArrayList 可以简单的认为是一个动态数组:实际上ArrayList就是用数组实现的,长度不够时,调用Arrays.copyOf方法,拷贝当前数组到一个新的长度更大的数 ...

最新文章

  1. 深证信息等三方拟联合开展大数据研究
  2. 关于深度学习的小知识点
  3. 【模拟】P1424 小鱼的航程(改进版)
  4. 有了这套模板,女朋友再也不用担心我刷不动 LeetCode 了
  5. 第一百四十五节,JavaScript,同步动画
  6. 经验 | 清华大学计算机系教授~浅谈研究生学位论文选题方法
  7. 2017.3.6 地精部落 思考记录
  8. linux内核串口调试,linux 串口调试方法
  9. 顺序右移数组元素(内测第0届第5题)
  10. MPU6050六轴传感器的原理及编程说明
  11. 2016最新PHP燕十八系统实战入门网站视频教程
  12. Ubuntu中报错:failed to create hard link
  13. Win10文件无法重命名
  14. uva 563 Crimewave
  15. 华为3Com孤单上路
  16. HIT CSAPP大作业--程序人生
  17. MySQL数据完整性约束
  18. Exchange Server2010系列之六:监控用户邮件
  19. Dubbo (二) ---------- Dubbo 框架
  20. 使用laravel开发微信公众的一个大坑,适合新手学习的laravel接入微信接口

热门文章

  1. SSH 命令常见用法
  2. CentOS下安装JDK完整步骤
  3. Python自动化(十二):一分钟搞定几百个Excel中查找的数据
  4. ZABBIX自动发现Redis端口并监控
  5. zabbix server下数据库日志报错
  6. Excel 公式 ・快捷键 ------- 不定期更新
  7. Java中的GC(垃圾回收)log
  8. 使用Eclipse查看反编译后的代码(Decompiler 插件)
  9. Linux 远程连接工具 【vnc viewer】 图形界面
  10. 实现随着 下拉菜单中 选中值的变化 周边的值也也跟着变化。(使用【 VLOOKUP 】 函数)