是否值得花一些结果集来预先分配java中的数组?

时间:2014-12-10 12:00:39

标签: java arrays jdbc arraylist

是否值得在SQL中计算结果,然后从jdbc调用(count,result)传回两个值,以便我可以确定大小并预分配数组,而不是使用arraylists来保存结果

似乎没有办法获胜:要么我在数据库中花费更多时间来计算行数,要么在使用arraylists时花时间在java应用程序中。

注意:

       
  • 我的结果集的计数不会超过100,000。    
  • 结果将主要是整数或双精度数(无字符串)。    
  • 我认为预分配的数组更好,因为稍后会对这些数组进行随机访问。    
  • 数组的数量大约是返回列数的3-4倍。    
  • 这些数组将分别被访问多次。    
  • 我的程序将作为服务被多次调用,因此从空间和时间角度来看,累积开销从可伸缩性的角度来看都很重要。这是我尝试使用数组的另一个原因。    
  • 我不想就阵列与arraylists开始辩论。我只想了解哪些更适合我的使用环境。

感谢。

3 个答案:

答案 0 :(得分:4)

为了获得计数而运行其他查询对我来说没有意义。

如果必须使用数组,最好首先从ResultSetArrayList读取数据,然后根据size()创建数组。 {1}}并将数据复制到它们。

但是,我认为访问ArrayList的速度比访问数组要慢。毕竟,ArrayList由实际数组支持,并具有相同的随机访问权限:

这是ArrayList

ArrayList::get

在使用public E get(int index) { RangeCheck(index); return (E) elementData[index]; } 时,唯一会让你失望的是,如果在向他们插入数据时必须多次调整大小,但是你只有这个问题,因为你不知道事先的数据大小,这就是你不能使用数组的确切原因。

答案 1 :(得分:3)

使用100k元素填充预设数组和使用100k元素填充arraylist之间的区别最多是几微秒,这比您与数据库的任何交互都要小几个数量级。所以获得计数很可能比两个选项之间的速度差异花费更多的时间。

所以我会保持简单并使用ArrayList。

除非您正在使用双精度和整数进行大量计算,在这种情况下使用基本数组(int[]double[])会有意义(但我可能仍会使用ArrayList来填充数据从db开始并在计算之前转换为数组。)

答案 2 :(得分:2)

正如其他人所指出的,ArrayList本质上是一个相当轻的包装器中的数组。所以你不会问很多问题。

上面还提到的是,您可以在创建时使用ArrayList构造函数预设ArrayList(int initialCapacity),也可以稍后使用ensureCapacity(int minCapacity)方法预设trimToSize()

如果确定合理容量的容量并不繁琐,通常会更有效。我这样说是因为根据结果集的提供方式,它可能会在内部光标遍历整个数据集以建立结果集大小,您可能很容易丢掉所有获得计数的增益!但是,如果你只知道列表会很大,那么无知地抛出100000仍然可能是值得的。尝试稍微超过而不是低估,如果你需要最后的松弛,请使用chunk = index/10000

在大多数现代系统中,100,000是一个大尺寸但不是很大。但是,如果存在诸如无法在长时间运行的系统或资源绑定过程中分配大量连续内存块的问题,则可以在分配“块”(例如10,000个元素)并使用inChunkIndex= index%10000索引它们之间进行简单平衡。和{{1}}。 请注意,此类对象的访问成本几乎在一个连续的块附近。

然而,你应该立即采取这种聪明之处。