我注意到了mongo的Spring数据中有一些奇怪的东西:
MongoRepository扩展了CrudRepository,findAll()返回了一个Iterable,这在count()方法中是可以的,因为它返回了一个long。
class CrudRepository {
...
Iterable<T> findAll();
long count();
}在mongo MongoRepository中,findAll()方法returs a List:
class MongoRepository extends CrudRepository {
...
@Override
List<T> findAll();
}但是List#size()返回一个int,MongoRepository#count()方法继续返回一个long。
当集合超过Integer.MAX_VALUE时会发生什么?我们还能打电话给List<T> findAll()吗?
发布于 2019-09-18 15:39:45
我喜欢你的观点:)根据你对这个问题。的要求,这个问题看起来很相似
正如Java规范中所提到的:https://docs.oracle.com/javase/specs/jls/se13/html/jls-15.html#jls-15.10.1
每个维度表达式都经历一元数字提升(第5.6.1节)。提升的类型必须是int,否则会发生编译时错误.
由于维度必须是int,所以我们可以在数组中存储最大大小的2,147,483,648,同时考虑到ArrayList只是数组,所以不能在ArrayList中存储比INTEGER.MAX_VALUE更多的内容。(当然,列表的不同实现可能表现得不同)
春季数据JPA允许您自定义查询方法。您总是可以自由地创建一个返回类型为Iterable的查询方法。
@Override
Iterable<T> findAll();发布于 2019-09-18 15:31:21
来自java.util.List#size javadoc:
返回此列表中的元素数。如果此列表包含多个
Integer.MAX_VALUEInteger.MAX_VALUE**.**元素,则返回。
因此,当集合大小超过Integer.MAX_VALUE时,size方法将返回Integer.MAX_VALUE。
我们还能打电话给
List<T> findAll()吗?
是的,但是很可能OutOfMemoryError的呼叫会失败
https://stackoverflow.com/questions/57996053
复制相似问题