当前位置: 首页 > news >正文

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的情况

转载于:https://www.cnblogs.com/Heliner/p/10524872.html

相关文章:

  • MySQL 连接 通过实例总结详解 笛卡尔积,自然连接,内连接,外连接
  • 前端的第一步
  • P3375 【模板】KMP字符串匹配
  • C++11并发——多线程std::thread (一)
  • unity下贴图混合(Texture Blending)
  • elasticsearch中ik词库配置远程热加载
  • OL4加载geowebcache 部署的离线切片
  • 在Net MVC中应用JsTree
  • nginx代理tcp协议连接mysql
  • markdown操作手册
  • [转载]URI 源码分析
  • HTML之常用标签及属性
  • jmeter 常见问题汇总
  • SPOJ COT3.Combat on a tree(博弈论 Trie合并)
  • HDU 2883 kebab
  • 2017-08-04 前端日报
  • avalon2.2的VM生成过程
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • MySQL数据库运维之数据恢复
  • RxJS: 简单入门
  • SAP云平台里Global Account和Sub Account的关系
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • SQL 难点解决:记录的引用
  • 仿天猫超市收藏抛物线动画工具库
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 区块链分支循环
  • 网页视频流m3u8/ts视频下载
  • 微信开放平台全网发布【失败】的几点排查方法
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #stm32整理(一)flash读写
  • (2020)Java后端开发----(面试题和笔试题)
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (ibm)Java 语言的 XPath API
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • ***利用Ms05002溢出找“肉鸡
  • .NET多线程执行函数
  • .NET开源快速、强大、免费的电子表格组件
  • 。Net下Windows服务程序开发疑惑
  • /etc/sudoers (root权限管理)
  • @Transaction注解失效的几种场景(附有示例代码)
  • [@Controller]4 详解@ModelAttribute
  • [20171101]rman to destination.txt
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...
  • [C++数据结构](31)哈夫曼树,哈夫曼编码与解码
  • [LeetCode刷题笔记]1 - 两数之和(哈希表)
  • [NOIP 2003] 栈(三种方法:DP、数论、搜索)
  • [PHP]严格类型
  • [python] 之 函数简介
  • [Qualcomm][Power]QCM2290功耗异常问题
  • [Ruby] 基础知识
  • [SageMath] 关于SageMath本地环境的搭建与基本使用