ArrayList中的一些小细节@JDK8
ArrayList中的一些小细节@JDK8
protected transient int modCount = 0;
该变量用于记录ArrayList的版本号,不可被序列化,每次对ArrayList操作都会修改此版本号,为ArrayList提供FastFail功能;可是,在每次操作中都操作此变量,会造成一个结果就是该变量会迅速变化,很快超过Integer.MAXVALUE;那么,当其发生溢出时会不会就不正确了呢,答案时否;
当int发生整形溢出的时候会从重新开始,这样保证了在有限的操作次数内,对于不同操作的版本号一定会不相同
int k = Integer.MAX_VALUE;
for (; ; ) {
System.out.println(k++);
try {
Thread.sleep(1000);
} catch (Exception e) {
}
}
输出:
private static final Object[] EMPTY_ELEMENTDATA = {};
和
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
两个居然一模一样
查看一下注释
/**
* Shared empty array instance used for default sized empty instances. We
* distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when
* first element is added.
*/
中文翻译:
用于默认大小的空实例的共享空数组实例。我们将其与EMPTY_ELEMENTDATA区分开来,以了解在添加第一个元素时要膨胀多少。
还是不太明了
接着往下看:
remove方法:
public boolean remove(Object o) {
if (o == null) {
for (int index = 0; index < size; index++)
if (elementData[index] == null) {
//仅仅移除第一个对象
fastRemove(index);
return true;
}
} else {
for (int index = 0; index < size; index++)
if (o.equals(elementData[index])) {
//仅仅移除第一个对象
fastRemove(index);
return true;
}
}
return false;
}
fastRemove方法:
private void fastRemove(int index) {
modCount++;
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // clear to let GC do its work
}
grow方法
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
不足够时,默认增长0.5倍,如果还是小于最小长度就赋予最小长度minCapacity=10
然后扩充
去除空闲的区域
public void trimToSize() {
modCount++;
if (size < elementData.length) {
elementData = (size == 0)
? EMPTY_ELEMENTDATA
: Arrays.copyOf(elementData, size);
}
}
因为有trimToSize()所以才有存在capacity<minCapacity的情况
ArrayList中的一些小细节@JDK8的更多相关文章
- 浅析C#组件编程中的一些小细节
控件与组件的区别(Control&Component的区别) 作者:作者不详 发布日期:2011-06-30 12:08:41 控件与组件的区别(Control&Component的 ...
- asp.net mvc开发过程中的一些小细节
现在做网站用mvc越来越普及了,其好处就不说了,在这里只记录一些很多人都容易忽视的地方. 引用本地css和js文件的写法 这应该是最不受重视的地方,有同事也说我有点小题大作,但我觉得用mvc还是得有一 ...
- 。Java中的一些小细节
1.main方法. ------任何一个Java程序都有一个main方法,它是程序的入口. ------当执行 “ java + 类名 “ 这个命令时,JVM就会去加载这个类,并且寻找这个类中的m ...
- yii框架中的一些小细节配置问题
1.查看运行时间'db'=>array( 'connectionString' => 'mysql:host=localhost;dbname=shop', 'emul ...
- Android中的一些小细节
在代码中获取到的padding .margin.getWidth.event.getX.context.getResources().getDimensionPixelSize(R.dimen.key ...
- php中的一些小细节(1)
<?php $a=false; echo $a; //var_dump($a); ?> 输出结果为: (即为空): 为什么会这样子? 查看官网对echo的相关资料得出: 结论:ec ...
- Oracle Sales Cloud:报告和分析(BIEE)小细节1——创建双提示并建立关联(例如,部门和子部门提示)
Oracle Sales Cloud(Oracle 销售云)是一套基于Oracle云端的客户商机管理系统,通过提供丰富的功能来帮助提高销售效率,更好地去了解客户,发现和追踪商机,为最终的销售成交 (d ...
- ASP.NET MVC 自定义路由中几个需要注意的小细节
本文主要记录在ASP.NET MVC自定义路由时,一个需要注意的参数设置小细节. 举例来说,就是在访问 http://localhost/Home/About/arg1/arg2/arg3 这样的自定 ...
- C++在使用Qt中SLOT宏须要注意的一个小细节
大家都知道C++虚函数的机制,对于基类定义为虚函数的地方,子类假设覆写,在基类指针或者引用来指向子类的时候会实现动态绑定. 但假设指针去调用非虚函数,这个时候会调用C++的静态绑定,去推断当前的指针是 ...
随机推荐
- $.getJSON() 回调函数没有执行的原因
$.getJSON() 方法使用 AJAX 的 HTTP GET 请求获取 JSON 数据. 语法 $.getJSON(url,data,success(data,status,xhr)) url必填 ...
- 71. Simplify Path (Stack)
Given an absolute path for a file (Unix-style), simplify it. For example, path = "/home/", ...
- 解决VirtualBox 上的XP 关机时重启 , 启动时蓝屏 ,点击电源选项蓝屏
三个问题一次性解决. 启动时的蓝屏显示错误信息是: STOP 0x000000CE (...) DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATION ...
- Qt webkitwidgets模块和webenginewidgets模块
问题 将Qt开发的程序从Qt5.5或更低的版本迁移到5.6或更高的版本时,会提示webkitwidgets是unknown module. Project ERROR: Unknown module( ...
- 洛谷 P1103 书本整理(动规)
洛谷 P1103 书本整理 题目描述 Frank是一个非常喜爱整洁的人.他有一大堆书和一个书架,想要把书放在书架上.书架可以放下所有的书,所以Frank首先将书按高度顺序排列在书架上.但是Frank发 ...
- ros console_bridge找不到
Could not find a package configuration file provided by "console_bridge" with any of the f ...
- Oracle 11g 重建EM需要删除的对象
因为需求需要重建EM,重建时因为某些错误被迫停止,比如对象已存在.用户已经存在等,最终找出了创建必备的条件: 1.环境变量(Oracle和Grid在同一个用户下安装) ORACLE_HOME 要设为D ...
- Ceph介绍
1. 介绍 云硬盘是IaaS云平台的重要组成部分,云硬盘给虚拟机提供了持久的块存储设备.目前的AWS 的EBS(Elastic Block store)给Amazon的EC2实例提供了高可用高可靠的块 ...
- 【转载】redis.conf文件详解
转载地址:http://blog.csdn.net/zhutulang/article/details/51969760 Redis.conf文件可以在github上查看,下面是我整理的其中的配置项( ...
- iframe是怎么跳转的
在main.jsp中 <iframe frameborder="0" marginheight="0" marginwidth="0" ...