Java 处理大小未定义的数组
我在做一个1D生产发电机。Im使用块来加载当前内容。我的问题是,我正在使用一个未定义大小的数组来存储数据。如果我使用ArrayList,它会在需要时创建一个新的数组来扩展它,但这不会产生垃圾吗Java 处理大小未定义的数组,java,arrays,arraylist,Java,Arrays,Arraylist,我在做一个1D生产发电机。Im使用块来加载当前内容。我的问题是,我正在使用一个未定义大小的数组来存储数据。如果我使用ArrayList,它会在需要时创建一个新的数组来扩展它,但这不会产生垃圾吗 如果使用一个大尺寸的缓冲阵列,将数据存储到其中会更快吗。根据数据块的长度创建一个新数组并保存数据?如果您事先不知道数组的确切大小,那么您将以任何一种方式创建垃圾。您要么过度分配数组的大小,要么最终不得不分配一个新数组,从旧数组复制值并转储旧引用。不管怎样,都是垃圾,这就是ArrayList在内部的工作方式
如果使用一个大尺寸的缓冲阵列,将数据存储到其中会更快吗。根据数据块的长度创建一个新数组并保存数据?如果您事先不知道数组的确切大小,那么您将以任何一种方式创建垃圾。您要么过度分配数组的大小,要么最终不得不分配一个新数组,从旧数组复制值并转储旧引用。不管怎样,都是垃圾,这就是ArrayList在内部的工作方式。它实际上只是一个数组的
列表
包装器
FWIW,我认为你对这个问题想得太多了。对象数组就是引用数组。在初始化之前,数组中的任何项实际上都不会占用足够的空间来引用内存地址。如果您事先不知道数组的确切大小,则会以任何方式创建垃圾。您要么过度分配数组的大小,要么最终不得不分配一个新数组,从旧数组复制值并转储旧引用。不管怎样,都是垃圾,这就是ArrayList在内部的工作方式。它实际上只是一个数组的
列表
包装器
FWIW,我认为你对这个问题想得太多了。对象数组就是引用数组。在初始化之前,数组中的任何项实际上都不会占用足够的空间来引用内存地址。在GC要收集的其他内容中,“创建垃圾”是什么意思?未使用的预分配空间?是供GC收集。问题是大小可能从10到1000甚至更多。如果您需要动态/可变空间,那么使用像
ArrayList
这样的集合可能比使用数组更好。至于JVM决定增加大小时浪费的空间,当您要求可变大小时,这是不可避免的。@DarioKowalski我建议您使用ArrayList,但如果您有预期的最小大小,请将ArrayList实例化为该大小,以防止不必要的列表增长。如果您需要存储原语,我希望您可以(或者你很快就会意识到,int!=java.lang.Integer
,sizeof(Integer)>sizeof(int)
,还有一种叫做boxing/unboxing
的原语类型。此外,还有许多第三方集合(动态扩展/收缩)来处理原语集合(高性能计算和高频交易者更喜欢使用的东西):类似或“创建垃圾”是什么意思与GC要收集的其他内容一样?预分配的未使用空间?是的,GC要收集。问题是大小可能从10到1000甚至更多。如果您需要动态/可变空间,那么使用像ArrayList
这样的集合可能比数组更可取。至于JVM决定增加时浪费的空间减小大小,这是无法避免的,因为您要求使用可变大小。@DarioKowalski我建议使用ArrayList,但如果您有期望的最小大小,请将ArrayList实例化为该大小,以防止不必要的列表增长。如果您需要存储基元,我希望您可以(或者您很快就会成为)注意到int!=java.lang.Integer
,sizeof(Integer)>sizeof(int)
,还有一种叫做装箱/拆箱的原语类型。另外,还有许多第三方集合(动态扩展/收缩)来处理原语集合(高性能计算和高频交易者更喜欢使用的东西):类似或