jdk 1.8下 java ArrayList 添加元素解析
转载请注明http://www.cnblogs.com/majianming/p/8006452.html
有人问我,java ArrayList底层是怎么实现的?我就回答数组,他再问我,那它是怎么实现数组的添加的呢?我也不知道,就不敢回答了。
回来赶紧看了一下java实现,明确的是ArrayList底层的确是用数组实现的,但是怎么实现数组的扩容的呢?
简单来说,就是创建一个新的比原来大的数组,把原来所有的元素复制到新的数组,然后添加新的数组进去
先从无参构造函数开始,无参构造函数创建了一个容量为0的空数组(这里要注意,在jdk1.8时采用的是创建空数组,在1.7还是创建了一个容量为10的数组,源码见附录1,2,这里以1.8为例)
然后就可以开始调用add方法添加元素,这里先以public boolean add(E e)方法为例
- 计算最小容量:判断是不是第一次添加,准确来说是不是一个空数组。如果是一个空数组,那么设置初始化大小(即最小容量)为10,如果不是,那么在原来基础上大小+1。
- 判断是否需要扩容:判断最小容量是不是大于数组长度(至少大1),如果是,进行第3步。为什么有这个判断?是最小容量是数组可以存放的元素个数,而数组长度是实际上存放的个数,那么就会出现数组还没放满的情况,比如第二次添加时,数组容量为10(第一次初始化时设置为10),元素加上新增加的只有两个,是不需要进行第3,4步的
- 扩容计算:复制旧元素到新数组:上一步计算的只是一个值,没有对原来的进行修改,也没有创建新的数组。接下来使用Arrays.copyOf将原来数组的所有元素复制到新数组(以最小容量创建的),并返回
- 取得已有元素的个数,准备设置新的容量为原来元素个数的1.5倍
- 将1中的新容量和最小容量相对比,取大的(所以初始化时原来元素的1.5倍为0小于最小容量10,设置为10)
- 将2中计算结果与Integer.MAX_VALUE - 8对比(为啥是-8 ,doc上是说明了一些虚拟机实现需要多存一些头信息,为了防止oom,其他没有说明,在stackoverflow上说明了为了存下数组的最大大小2,147,483,648所以需要(见附录3)),还大,那就没办法了,只能设置为Integer.MAX_VALUE。也就是说正常情况下数组最大容量为下最大值减8,否则就是最大值。这个时候放不下那就只能抛异常了呗!
- 复制旧元素到新数组:上一步计算的只是一个值,没有对原来的进行修改,也没有创建新的数组。接下来使用Arrays.copyOf将原来数组的所有元素复制到新数组(以3中计算的最后容量创建的),并返回
- 把添加的元素添加到新返回的数组最后,长度+1
以上
附录
参考
设定
jdk:1.8_102
转载请注明http://www.cnblogs.com/majianming/p/8006452.html
jdk 1.8下 java ArrayList 添加元素解析的更多相关文章
- JDK问题--linux下java unrecognized class file version错误的解决
linux下java unrecognized class file version错误的解决 环境:RedHat Linux Enterprise 5.4 问题:java.sun.com下载jdk1 ...
- java ArrayList添加元素全部一样
#开始 今天遇到了一个很神奇的事情 也即是我在用ArrayList的add方法循环加入对象的时候 发现添加的元素全部都是一样的 定位错误定位了一个下午.... 错误位置就是哪一个位置 但是就是不知道为 ...
- java中jre\bin目录和jdk\bin目录下的工具功能介绍
转自:https://blog.csdn.net/eclipse_yin/article/details/51051096 jre/bin目录下面工具说明 javac:Java编译器,将Java源代码 ...
- Linux(Ubuntu 16) 下Java开发环境的配置(一)------JDK的配置
前言: 本文介绍的是通用的安装方法,一般linux系统均可使用该方法安装.本文以Java8环境为例进行配置. 1.JDK的下载 进入java下载页(http://www.oracle.com/te ...
- Java java jdk在Linux下安装与环境变量的配置
java jdk在Linux下安装与环境变量的配置 by:授客 QQ:1033553122 linux环境:CentOS-6.0-x86_64-bin-DVD1.iso [root@localhost ...
- ubuntu下java JDK环境配置
ubuntu下配置JDK环境变量ubuntu下的JDK配置本质上和win一样的:1.去官网下载JDK,选择适合自己版本,我下载的版本是jdk-8u121-linunx-x64.tag.gz,官方网址h ...
- Windows下Java JDK安装和环境变量配置
[Java攻城狮学习路线](http://www.cnblogs.com/apollospotatolikett/p/8665123.html 1.JDK下载 下载地址:http://www.orac ...
- java代码如何在没有安装JDK的Windows下运行
java代码如何在没有安装JDK的Windows下运行? 对于Java桌面应用来说,比较烦琐的就是安装部署问题,如:客户端是否安装有jre.jre版本.jre在哪里下载.如何用jre启动Java应用等 ...
- java:Conllection中的List,ArrayList添加元素,删除元素,输出元素
java:Conllection中的List,ArrayList添加元素,删除元素,输出元素 //为list接口实例化 List<String> addlist = new ArrayLi ...
随机推荐
- 设计模式之解释器模式(Interpreter)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- web.xml文件中各个配置的说明
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://w ...
- Android 使用 DownloadManager 管理系统下载任务的方法
在红黑联盟上看到的.这几天一直考虑做一个Notification 的带下载功能的自己定义通知.但没搞出来.无意中在论坛看到这个.先Mark,明天试试. 从Android 2.3(API level 9 ...
- 使用 C# 开发智能手机软件:推箱子(三)
这是"使用 C# 开发智能手机软件:推箱子"系列文章的第三篇.在这篇文章中,介绍 Common/Block.cs 源程序文件. 1 namespace Skyiv.Ben.Pu ...
- JAVA注解引发的思考
自从JDK5開始Java開始添加了对元数据(MetaData)的支持,也就是注解(Annotation),到JDK7时已经有四种基本注解,新添加了一种@SafeVarargs. @Override注解 ...
- arcgis 发布地图服务
arcgis中,地图文档需要发布,才能为WEB所用. 咋发布呢? 1.在arcmap里面,点击 文件 - 共享为 - 服务 2.在弹出的对话框里选"发布服务",然后 3.这里面有点 ...
- BZOJ4561:圆的异或并(扫描线+set||splay||线段树)
在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面 积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个圆内则不考虑. I ...
- [转]python的find()方法
描述 Python find() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,如果包含子字符串返回开始的索引值,否则返回 ...
- #!/usr/bin/env ruby 与 #!/usr/bin/ruby 的区别(copy)
[说明:资料来自http://blog.csdn.net/wh_19910525/article/details/8040494] 脚本语言的第一行,目的就是指出,你想要你的这个文件中的代码用什么可执 ...
- (转)C#中数组、ArrayList和List三者的区别
原文地址:http://blog.csdn.net/zhang_xinxiu/article/details/8657431 在C#中数组,ArrayList,List都能够存储一组对象,那么这三者到 ...