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 ...
随机推荐
- django框架之drf:2、restful规范,序列、反序列化,drf安装及使用(django原生接口及drf接口编写)
Django之drf 一.restful规范 1.概念 REST全称是Representational State Transfer,中文意思是表述:表征性状态转移,它首次出现在2000年Roy ...
- immutable.js学习笔记(六)----- OrderedSet
一.OrderedSet 二.普通Set 与 OrderedSet 注意:普通Set并不是严格的一定是升序的 三.takeWhile 四.升序 sort valueA - valueB 五.降序 va ...
- App测试Android的闪退总结
Android的闪退有三种情况: 第一种:没有任何弹框提示,直接退出 第二种:有弹框提示程序异常 第三种:ANR无响应 三种情况的日志提交和检索方法: 第一种情况:是底层C挂了 **首先:提交客户端 ...
- 免费的在线PS工具
免费的在线PS工具:https://www.logosc.cn/online-ps
- PX4源码地址和wiki
[源码] https://github.com/987419640/Firmware [wiki] https://dev.px4.io/v1.9.0/zh/concept/architecture. ...
- LG P3768 简单的数学题
\(\text{Problem}\) 求 \[\left(\sum_{i=1}^n \sum_{j=1}^n i j \gcd(i,j)\right) \bmod p \] \(n \le 10^{1 ...
- 代码随想录算法训练营day09 | leetcode 28. 实现 strStr()
LeetCode 28. 实现 strStr() 牢记一点:next[i] 元素表示[0,i]子串的最长相等前后缀个数,也是模式串与主串匹配不相等时模式串的下一个比较索引 分析1.0 前缀是指不包含最 ...
- CF845F - Guards In The Storehouse
题意:在 \((x,y)\) 放一个哨兵,可以监视本行后面的所有格子直到障碍.本列后面所有的格子直到障碍.求使全盘最多一个位置不被监视的方案总数. 我们发现,因为 \(nm\le 250\),所以 \ ...
- 记录篇-浪潮服务器raid卡
在说raid卡之前,首先,我们要明确,不同的raid卡型号,会有不同的配置方式,但是总体来说是大同小异的 这里举例浪潮机架式服务器经常用到的raid卡型号: PM8204 (其实像3108 ...
- sql server 主键自增
ALTER TABLE tableName ADD column INT IDENTITY (1, 1);