Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果数组索引没有值,它们是否会影响性能/内存使用_Java_Arrays - Fatal编程技术网

Java 如果数组索引没有值,它们是否会影响性能/内存使用

Java 如果数组索引没有值,它们是否会影响性能/内存使用,java,arrays,Java,Arrays,我是Java新手,最近我一直在思考巨大但部分为空的数组的内存消耗,如本例所示: 我需要一个未知大小的数组-它可以是300k的值,也可以是300m的值,但要记住它可能只保留50个值 我正在初始化大小为的数组 int values[] = new int[Integer.MAX_VALUE]; 每次使用给定的生成方法时,用户生成一定数量的值,这些值必须存储在数组中 使用超大阵列是否有任何禁忌症?如果仅使用了0,1%的阵列,而阵列使用率为100%,那么阵列的大小对性能有何影响 换句话说,当我调

我是Java新手,最近我一直在思考巨大但部分为空的数组的内存消耗,如本例所示:

  • 我需要一个未知大小的数组-它可以是300k的值,也可以是300m的值,但要记住它可能只保留50个值
  • 我正在初始化大小为的数组

    int values[] = new int[Integer.MAX_VALUE];
    
  • 每次使用给定的生成方法时,用户生成一定数量的值,这些值必须存储在数组中

使用超大阵列是否有任何禁忌症?如果仅使用了0,1%的阵列,而阵列使用率为100%,那么阵列的大小对性能有何影响

换句话说,当我调用X int值的空数组时,初始化时的JVM是否会为X*保留内存(用于存储1 int值的内存),即使还没有存储任何值

谢谢,丹尼尔

如果仅使用了0,1%的阵列,而阵列使用率为100%,那么阵列的大小对性能有何影响

没有所谓的“X int值的空数组”。每个元素都有一个值——默认值为0。无论其值如何,每个元素都将占用4个字节。您的
新int[Integer.MAX\u VALUE]
数组将占用8GB内存


如果要创建稀疏数组,则可能需要考虑使用<代码>映射< /COD>。但是,请注意,虽然可以使用

int
数组,但映射的值需要
Integer
类型-如果超出缓存的
Integer
值的范围(如果有许多不同的值),则可能会在
Integer
对象(以及对它们的引用)上浪费大量空间.

初始化数组时,会在内存中为其保留一个位置。此内存大小不会因数组中的值而改变。int数组中的默认值为0,因此您的数组并非部分为空。

数组列表有什么问题?@Boristeider您是否认真建议使用大小为
Integer.MAX_值
的数组列表来存储
int
值?只是没有。OP显示的数值高达3亿;对于
ArrayList
@borisspider来说,这应该没问题。我觉得在这里使用
ArrayList
没有什么意义,因为OP可能会创建这么大的数组,但并没有完全填充它(据我所见),原因只有一个:他更喜欢通过索引访问项目。因此,
ArrayList
在这里没有帮助。
Map
应该更合适,关键是
Integer
。@Boristeider我的假设是索引未知。所以“300m”值并不意味着从0到29999999的3亿个值,它意味着3亿个任意值。在这种情况下,ArrayList不是一个好的选择,特别是考虑到存储
int
(作为对象)的开销,而不是存储到
int[]
。或
ArrayList
,或任何类型的
列表
。@Brandon:嗯,对
ArrayList
-是的,但创建一个
列表
实现是完全可行的,该实现专为稀疏填充而设计。