我注意到 mongo 的 Spring 数据中有些奇怪:
MongoRepository
扩展CrudRepository
,findAll()
返回一个Iterable
,count()
方法可以,因为它返回一个long
。
class CrudRepository {
...
Iterable<T> findAll();
long count();
}
在 mongoMongoRepository
中,findAll()
方法引用一个List
:
class MongoRepository extends CrudRepository {
...
@Override
List<T> findAll();
}
但是List#size()
返回一个int
,而MongoRepository#count()
方法保持返回长整型。
当集合超过Integer.MAX_VALUE
时会发生什么!?我们还能打电话给List<T> findAll()
吗?
我喜欢你的观点:)根据您对此问题提出的问题,此问题看起来很相似。
正如 Java 语言规范:15.10.1 中提到的。数组创建表达式:
每个维度表达式都会经历一元数值提升 (§5.6.1(。升级的类型必须为 int,否则会发生编译时错误。
由于 dimension 必须是 int,我们可以在数组中存储最大大小2,147,483,648
,并且考虑到 ArrayList 只不过是一个数组,我们不能存储超过 INTEGER。MAX_VALUE数组列表中。(当然,List的不同实现可能会有不同的行为(
Spring Data JPA允许您自定义查询方法。您始终可以自由创建一个返回类型为可迭代的查询方法。
@Override
Iterable<T> findAll();
来自java.util.List#size
javadoc:
返回此列表中的元素数。如果此列表包含
Integer.MAX_VALUE
个以上的元素,则返回Integer.MAX_VALUE
。
因此,当集合大小超过Integer.MAX_VALUE
时,size
方法将返回Integer.MAX_VALUE
。
我们还能打电话给
List<T> findAll()
吗?
是的,但很可能调用会失败并显示OutOfMemoryError