关于Java中ArrayList最大容量Integer.MAX_VALUE-8中的8所代表的意义

2023-11-02

关于为何要减8这个问题,可以从出现何种错误的角度去看。
你可以在程序中试图直接分配Integer.MAX_VALUE大小的ArrayList。

ArrayList<Integer> list = new ArrayList<>(Integer.MAX_VALUE);

此时,你大概率得到一个错误:

Requested array size exceeds VM limit
译文:请求的数组大小超过 VM 限制

其实这就是为什么会有减8出现的原因。

由于在不同的平台上,受到平台的影响导致能够为数组分配的实际最大数值并非为Integer.MAX_VALUE(2,147,483,647),而是与这个值相接近的数值。

因此,作者减8实际上是因为不想让你创建的数组在扩容时计算的新容量值等于或过于接近最大值不能被平台分配出来而报出上述错误。

这样你的程序在不同平台上运行时不会因为分配数值过大而被平台限制而出现报错。换言之,Integer.MAX_VALUE-8将会保证你的程序在任何平台上都不会因为分配问题而报出Requested array size exceeds VM limit错误。

更多请参考以下网站:
Java 8 Arraylist hugeCapacity(int) implementation - Stack Overflow

接下来,有关于作者在源码中的注释

 /**
  * The maximum size of array to allocate (unless necessary).
  * Some VMs reserve some header words in an array.
  * Attempts to allocate larger arrays may result in
  * OutOfMemoryError: Requested array size exceeds VM limit
  */
译文:
要分配的数组的最大大小(除非必要)。
有些虚拟机在数组中保留一些头词。
尝试分配更大的数组可能导致
OutOfMemoryError:请求的数组大小超过虚拟机限制
*/

关键在于Some VMs reserve some header words in an array.这句解释,个人理解这句话想要表示的是有的VM因保存数组对象头而导致不允许分配数组大小达到Integer.MAX_VALUE(至于为何会产生这种限制本人也不太清楚,后续得知将会补充)。所以减8不是表示减去数组对象头8bytes,而是用于规避不同VM间差异而导致的OutOfMemoryError错误。只是作者减去的数值正好与数组对象头的数值相同而导致被误解。

欢迎在评论区发表自己的看法!

END

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于Java中ArrayList最大容量Integer.MAX_VALUE-8中的8所代表的意义 的相关文章

随机推荐

  • 海思芯片上GPIO和PWM操作

    一 GPIO的配置 GPIO的设置一般为三步 1 设置gpio端口复用 2 设置GPIO口的方向 3 读取或者写入GPIO值 第一步不是每个GPIO口都是要配置的 如果你设置的GPIO端口有复用功能 那么你需要对GPIO对应复用寄存器进行配
  • Simulink搭建三相PWM整流器过程

    三相PWM整流器的基本构成 过年期间闲来无事 对PWM整流器进行了一点了解 然后用Simulink搭建了一个PWM整流器的模型 现在对这个过程进行归纳 希望对大家有帮助 首先贴出三相PWM整流器的电路简图如下图 其中V1 V2 V3是三相电
  • 左手坐标系和右手坐标系以及Unity中的世界坐标系和本地坐标系

    一 左手坐标系和右手坐标系 左手坐标系 伸开我们的左手 掌心向外 大拇指与食指成90度 中指 无名指和小指弯曲 大拇指指向的方向就是X轴正方向 食指指向的方向就是Y轴正方向 中指 无名指和小指指向的方向就是Z轴正方向 右手坐标系 伸开我们的
  • 快速突破面试算法之双指针篇

    前言 什么是双指针 砸门用大白话来说 就是两个定位装置 那么这两个定位装置有什么用呢 那肯定去定位撒 而且更高级的是这装置上面还有摄像头 可以看见当前所在位置的情况 现在我们给两个装置各自赋予动力 先赋予相同的动力 及移动速度一样 现在这两
  • 实现 vue2 中使用 vue-i18n 实现中英文切换功能

    1 下载包 版本要对应 2的版本8可以 vue3要用到9 npm install vue i18n 8 S 2 创建i18n js文件 import Vue from vue import Element from element ui i
  • 使用dd命令制作U盘启动盘

    1 插入U盘 df h查看U盘文件系统挂载情况 然后使用umount dev sdb 卸载U盘文件系统 2 执行命令 sudo mkfs vfat I dev sdb格式化U盘为FAT格式 3 dd if iso of dev sdb bs
  • vmware ubuntu与windows共享文件夹目录不显示的一种解决方法

    问题 mnt文件夹中没有共享的文件夹目录 甚至hgfs文件夹也没有 解决方法 1 我自己摸索出来的 在上图的界面 文件夹共享 下的选项选择 已禁用 点击最下方 确认 图中没有显示 被遮住了 再打开这个虚拟机设置界面 vmware界面上方工具
  • MAC强制卸载软件 如遇“不能修改或删除“*”,因为macOS需要它”

    连上小飞机后不知道怎么就下了个 流氓软件 疯狂卸载也卸载不掉 找了一个小时的攻略终于解决了 就是下面这个 很多人推荐用AppDelete这个应用卸载 尝试了一下并没有成功 用命令 sudo rm rf 应用名称 也没有卸载掉 尝试了一下解除
  • UE4 回合游戏项目 13- 生成敌人

    在上一篇 UE4 回合游戏项目 12 添加敌人受到攻击的动画 的基础上继续完成生成敌人的功能 效果 步骤 1 打开battleScenario 战斗场景 2 创建从类生成AI这个节点 现在我们需要获取到敌人的引用 以及敌人的数量 3 创建一
  • python内装饰器

    一 内置装饰器 内置装饰器 含义 classmethod 类方法 staticmethod 静态方法 二 普通方法 回顾 定义 第一个参数为self 代表 实例本身 调用 要有实例化的过程 通过 实例对象 方法名 调用 1 定义类 clas
  • 跳跃表原理

    跳跃表原理 最近看了一种数据结构叫做skipList redis和levelDB都是用了它 Skip List是在有序链表的基础上进行了扩展 解决了有序链表结构查找特定值困难的问题 查找特定值的时间复杂度为O logn 他是一种可以代替平衡
  • MySQL sku 数据批量导入_求node.js中mysql商品sku批量更新解决方案

    前提 不使用循环 1 sku具备添加 删除 修改功能 绑定数据sku sku goods id 1MJlrjS17jQ id 103 inventory 10 price 588 sku id 15617774918 sku name 黑色
  • Vue 富文本编辑器:vue-quill-editor粘贴图片上传服务器

    Vue 富文本编辑器 vue quill editor粘贴图片上传服务器 粘贴图片 vue quill editor复制图片实际上会以 base64 形式的进行一个上传 写进数据库后会导致数据一些加载问题 解决方法 将复制的图片先上传到服务
  • matlab产生随机数或随机矩阵

    Matlab中随机数生成器主要有 betarnd 贝塔分布的随机数生成器 binornd 二项分布的随机数生成器 chi2rnd 卡方分布的随机数生成器 exprnd 指数分布的随机数生成器 frnd f分布的随机数生成器 gamrnd 伽
  • Oracle中自动生成id的函数以及注意事项

    Oracle中自动生成id的函数 sys guid SELECT sys guid FROM aTable a 注意 上面这个是可以自动生成id 但是很多时候自动生成的id会出现乱码 原因 SYS GUID 以16位RAW类型值形式返回一个
  • arcgis中显示的图元根据投影坐标系确定单位

    这个迷糊了 如果是地理坐标系 则图元为经纬度 如果是投影坐标系 则图元为米
  • ESP8266使用邮件客户端 Arduino 库发送邮件(兼容ESP32)

    使用 ESP8266 发送邮件可以方便地处理各种事情 可以让 ESP8266 直接访问您的邮件服务器 例如 Gmail Hotmail Outlook 并通过它发送邮件 但许多邮件服务器会拒绝从不同于邮件服务器的域 您的 ip 发送的邮件
  • JS中Set去重

    Set类似于数组 但成员均是唯一的 没有重复值 Set本身是一个构造函数 用来生成Set数据结构 数组去重 const arr 2 2 3 4 4 const uniqe new Set arr 2 3 4 Array from方法可以将S
  • java实现姓名、手机号和银行卡中间用*号代替

    package com util date Description 模拟各大网站充值时的数据显示 author ShengLiu date 2018 7 4 public class TestUtil 定义所有常量 public stati
  • 关于Java中ArrayList最大容量Integer.MAX_VALUE-8中的8所代表的意义

    关于为何要减8这个问题 可以从出现何种错误的角度去看 你可以在程序中试图直接分配Integer MAX VALUE大小的ArrayList ArrayList