是否值得在SQL中计算结果,然后从jdbc调用(count,result)传回两个值,以便我可以确定大小并预分配数组,而不是使用arraylists来保存结果
似乎没有办法获胜:要么我在数据库中花费更多时间来计算行数,要么在使用arraylists时花时间在java应用程序中。
注意:
感谢。
答案 0 :(得分:4)
为了获得计数而运行其他查询对我来说没有意义。
如果必须使用数组,最好首先从ResultSet
到ArrayList
读取数据,然后根据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}}。
请注意,此类对象的访问成本几乎在一个连续的块附近。
然而,你应该立即采取这种聪明之处。