java ArrayList 原理
概述
底层通过数组实现,所以 查询/更新效率很高,删除/增加跟位置相关,除未实现同步外和 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 原理的更多相关文章
- Java集合 ArrayList原理及使用
ArrayList是集合的一种实现,实现了接口List,List接口继承了Collection接口.Collection是所有集合类的父类.ArrayList使用非常广泛,不论是数据库表查询,exce ...
- JAVA监听器原理
http://blog.csdn.net/longyulu/article/details/25054697 JAVA监听器原理 标签: 监听器 2014-05-05 15:40 9070人阅读 评论 ...
- Java编译原理
http://wenku.baidu.com/view/f9b1734b87c24028915fc3a3.html Java编译原理 1. 关于动态加载机制 学习Java比C++更容易理解OOP的思想 ...
- Java:HashMap原理与设计缘由
前言 Java中使用最多的数据结构基本就是ArrayList和HashMap,HashMap的原理也常常出现在各种面试题中,本文就HashMap的设计与设计缘由作出一一讲解,并解答面试常见的一些问题. ...
- [JavaEE]Java NIO原理图文分析及代码实现
转http://weixiaolu.iteye.com/blog/1479656 目录: 一.java NIO 和阻塞I/O的区别 1. 阻塞I/O通信模型 2. java NIO ...
- Java NIO原理分析
Java IO 在Client/Server模型中,Server往往需要同时处理大量来自Client的访问请求,因此Server端需采用支持高并发访问的架构.一种简单而又直接的解决方案是“one-th ...
- Java跨平台原理
此篇博文主要源自网络xiaozhen的天空的博客:http://xiaozhen1900.blog.163.com/blog/static/1741732572011325111945246/ 1.是 ...
- 【转】Java跨平台原理
原文地址:http://www.cnblogs.com/gw811/archive/2012/09/09/2677386.html 1.是么是平台 Java是可以跨平台的编程语言,那我们首先得知道什么 ...
- 《Java虚拟机原理图解》 1.2、class文件里的常量池
[最新更新:2014/11/11] 了解JVM虚拟机原理 是每个Java程序猿修炼的必经之路. 可是因为JVM虚拟机中有非常多的东西讲述的比較宽泛.在当前接触到的关于JVM虚拟机原理的教程或者博客中 ...
- Java NIO原理图文分析及代码实现
原文: http://weixiaolu.iteye.com/blog/1479656 目录: 一.java NIO 和阻塞I/O的区别 1. 阻塞I/O通信模型 2. java ...
随机推荐
- Java基础学习笔记-常量与变量♪(^∇^*)
常量与变量相同点 都有作用域,跟JS差不多, 变量的作用域:一对{ }之间有效 1.局部 2.全局 2.1.属于类的量(类常量和类变量) 2.2.属于实例的量(实例常量和实例变量) • 前面都可加权限 ...
- flutter Error:Cannot run with sound null safety, because the following dependencies don't support
学习flutter新版本的路上,真的是一天一个新惊喜啊 今天遇到的坑是 Flutter 升级高版本后,运行和build 报错 Error: Cannot run with sound null saf ...
- VUE assets里的scss没有引用会被打包进代码里,本地代码和打包后的代码样式不一致解决办法
1.打包部署后,发现样式和本地运行时候代码不一致 经过排查发现 这个路径的文件被打包进去了,但是我并没有引用这个文件啊啊啊啊啊a~~~~ src\assets\webgl-assets\scss\st ...
- 日常JS数据各种操作方法总结~~欢迎大家留言板补充哦~~
需求情景一: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- 动力节点——day03
接收键盘的输入:1.创建一个键盘扫描器对象 java.util.Scanner s=new Scanner(System.in); 2.接收用户输入s.nextInt(); 静态变量在类加载的时候就分 ...
- 模板层语法、模板层之标签、模板的继承与导入、模型层之ORM常见关键字
模板层语法.模板层之标签.模板的继承与导入.模型层之ORM常见关键字 一.模板层语法 1.模板语法的传值 urls代码: path('modal/', views.modal) views代码: de ...
- python字符串表达式求值
背景: 在开发的过程中涉及到动态的根据公式计算数值 技术上选择了python a= eval("1+2*(3+1)") print(a)
- 超详细!Jmeter性能测试
前言 性能测试是一个全栈工程师/架构师必会的技能之一,只有学会性能测试,才能根据得到的测试报告进行分析,找到系统性能的瓶颈所在,而这也是优化架构设计中重要的依据. 测试流程: 需求分析→环境搭建→测试 ...
- LeetCode 周赛 333,你管这叫 Medium 难度?
本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 大家好,我是小彭. 上周是 LeetCode 第 333 场周赛,你参加了吗?这场周赛质量很高,但难度标得不 ...
- yaml进阶用法
我们知道 json 是 yaml 的子集,作为超集的 yaml,必然有着很多与 json 不一样的特性,比如定义变量.引用.拼接等,下面来看看吧~ 为了方便和python的字典快速对比,我们直接使用y ...