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