概述

底层通过数组实现,所以 查询/更新效率很高,删除/增加跟位置相关,除未实现同步外和 Vector 大致相同

自动扩容,每次扩容大概 1.5 倍,扩容代价比较高尽量避免

实现了 RandomAccess 接口,使用 for 遍历效率高

最大长度为 Integer.MAX_VALUE

扩容

扩容是自动扩容的,每次扩容大概1.5倍

扩容是复制一个新的数组,并把新的数组的长度设置为原来的 1.5 倍,原来的数组就不用了。代价很高,需要尽量避免,可以初始化时指定长度或者添加大量元素前手动调用 public void ensureCapacity(int minCapacity) 来扩容一次,避免后续自动多次扩容

public boolean add(E e) {
// 数组扩容,不是一定要扩容,需要扩容才扩容
// 初始化 ArrayList 时如果不指定长度或者指定长度为0,size 就是 0(属性 size 是 int,默认值是0)
ensureCapacityInternal(size + 1);
// 数组最后一个位置存放新增的元素(elementData是底层存放数据的数组)
elementData[size++] = e;
return true;
} // 扩容方法具体逻辑(minCapacity 是 size+1)
private void ensureCapacityInternal(int minCapacity) {
// calculateCapacity(elementData, minCapacity):确定数组添加元素后的真实长度
// ensureExplicitCapacity():1,记录 list 修改次数;2,添加元素后是否扩容
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
} // 确定数组添加元素后真实长度逻辑
private static int calculateCapacity(Object[] elementData, int minCapacity) {
// 初始化 ArrayList 没有指定长度或指定长度是0时 elementData 就等于 DEFAULTCAPACITY_EMPTY_ELEMENTDATA(构造方法)
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
// 如果初始化时没有指定长度或长度是0时,size 是 0,minCapacity = size+1,所以 minCapacity 就是1
// DEFAULT_CAPACITY 是 10,两者取其大作为 数组长度
return Math.max(DEFAULT_CAPACITY, minCapacity);
}
// 如果初始化时指定了长度,那么就是 size+1 为数组长度
return minCapacity;
} // 真正的扩容处理
private void ensureExplicitCapacity(int minCapacity) {
modCount++; // 记录修改次数
// 如果新的长度大于原来的长度就扩容
if (minCapacity - elementData.length > 0)
// 进入这里就表明需要扩容了(大约原来的长度1.5倍):1,复制一个新的数组;2,更新 size(然后回到 add() 方法中把元素放在数组末尾)
grow(minCapacity);
}

添加元素 add 和 addAll 方法

如果是尾部添加,并且添加元素后数组的长度不超过原来的长度,效率是比较高的;如果指定下标位置添加(不是尾部添加),会涉及元素的移动(当前下标之后的元素都向后移动,把当前位置设置为新元素)这时代价是比较高的

remove() 方法是 add() 的逆过程,如果指定下标,也会涉及元素移动,代价比较高

获取和修改 get 和 set

不会涉及元素移动,效率是很高的

java ArrayList 原理的更多相关文章

  1. Java集合 ArrayList原理及使用

    ArrayList是集合的一种实现,实现了接口List,List接口继承了Collection接口.Collection是所有集合类的父类.ArrayList使用非常广泛,不论是数据库表查询,exce ...

  2. JAVA监听器原理

    http://blog.csdn.net/longyulu/article/details/25054697 JAVA监听器原理 标签: 监听器 2014-05-05 15:40 9070人阅读 评论 ...

  3. Java编译原理

    http://wenku.baidu.com/view/f9b1734b87c24028915fc3a3.html Java编译原理 1. 关于动态加载机制 学习Java比C++更容易理解OOP的思想 ...

  4. Java:HashMap原理与设计缘由

    前言 Java中使用最多的数据结构基本就是ArrayList和HashMap,HashMap的原理也常常出现在各种面试题中,本文就HashMap的设计与设计缘由作出一一讲解,并解答面试常见的一些问题. ...

  5. [JavaEE]Java NIO原理图文分析及代码实现

    转http://weixiaolu.iteye.com/blog/1479656 目录: 一.java NIO 和阻塞I/O的区别      1. 阻塞I/O通信模型      2. java NIO ...

  6. Java NIO原理分析

    Java IO 在Client/Server模型中,Server往往需要同时处理大量来自Client的访问请求,因此Server端需采用支持高并发访问的架构.一种简单而又直接的解决方案是“one-th ...

  7. Java跨平台原理

    此篇博文主要源自网络xiaozhen的天空的博客:http://xiaozhen1900.blog.163.com/blog/static/1741732572011325111945246/ 1.是 ...

  8. 【转】Java跨平台原理

    原文地址:http://www.cnblogs.com/gw811/archive/2012/09/09/2677386.html 1.是么是平台 Java是可以跨平台的编程语言,那我们首先得知道什么 ...

  9. 《Java虚拟机原理图解》 1.2、class文件里的常量池

    [最新更新:2014/11/11]  了解JVM虚拟机原理 是每个Java程序猿修炼的必经之路. 可是因为JVM虚拟机中有非常多的东西讲述的比較宽泛.在当前接触到的关于JVM虚拟机原理的教程或者博客中 ...

  10. Java NIO原理图文分析及代码实现

    原文: http://weixiaolu.iteye.com/blog/1479656 目录: 一.java NIO 和阻塞I/O的区别      1. 阻塞I/O通信模型      2. java ...

随机推荐

  1. PWA-H5 Web App优化探索之路(Service Worker,Lighthouse)

    PWA是什么? Progressive Web App 渐进式web应用程序,简单来说,就是可以让你的WEB App,带来与原生App相媲美的用户体验.. 为什么要用PWA? 简单来说,是为了web应 ...

  2. Flutter框架渲染流程与使用

    Flutter简述 Flutter是一个UI SDK, 可以进行移动端(iOS, Android),Web端, 桌面,它是一个跨平台解决方法. Flutter的特点:美观,快速,高效,开放. 美观:F ...

  3. 反射_Class对象功能概述-反射_Class对象功能_获取Field

    反射_Class对象功能概述 * Class对象功能: * 获取功能: 1. 获取成员变量们 * Field[] getFields() :获取所有public修饰的成员变量 * Field getF ...

  4. java 进阶P-3.7

    HASH表 Java 集合框架 HashMap 是一个散列表,它存储的内容是键值对(key-value)映射. HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的 ...

  5. JavaScript所有内部属性列表 [[Configurable]] 等

    简介 据MDN文档所说内部属性是由 [[···]] 包裹的内容,于是我们去复制 ECMA-262 标准的所有文字部分,然后用正则统计 [[···]] 的出现并打印 效果 代码 经老大提醒,这里的正则并 ...

  6. Cesium中各种坐标以及相互转换(七)

    2023-01-11 1.坐标系 Cartesian3 笛卡尔坐标,又叫世界坐标,是一个三维空间中的点 ,具有xyz,类似:(-1314910.6675027965, 5328726.84641194 ...

  7. JZOJ 3213. 【SDOI2013】直径

    题目 思路 树的直径很好求,两遍 \(dfs\),记下两个端点 然后很显然所有直径经过的边必然在我们求出的这条直线上 那么我们只要判断一下一条直径上的边是不是答案 假设当前边为 \(i\) 那么把 \ ...

  8. AKS for Gitpod

    ------实习期间做的一个小项目 距今一个多月两个月----------------- 1.First Week local k8s 命令行:kubectl 运行Kubernetes: kind,m ...

  9. GIT初学者详细指令学习

    参考网站:https://www.liaoxuefeng.com/wiki/896043488029600 基础概念 1.自定义名字和邮箱号 git config --global user.name ...

  10. Vue学习笔记之组件与通信

    1. 组件 1.1. 什么是组件 组件是可复用的Vue实例, 说白了就是一组可以重复使用的模板,通常一个应用会以一棵嵌套的组件树的形式来组织: 例如,你可能会有页头.侧边栏.内容区等组件,每个组件又包 ...