Java 8 Stream 有size限制?

结贴是美德 2017-08-03 04:34:38
抛异常:

new Random()
.ints()
.limit(Integer.MAX_VALUE)
.sorted()
.sum();



抛另一种异常:

new Random()
.ints()
.limit(Integer.MAX_VALUE - 9)
.sorted()
.sum();


求解




...全文
452 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
huawangxin 2017-08-03
  • 打赏
  • 举报
回复
1楼说的正解,详细还可以参考这个,我正好学习下 https://stackoverflow.com/questions/28967111/spark-java-error-size-exceeds-integer-max-value
huawangxin 2017-08-03
  • 打赏
  • 举报
回复
1楼正解,学习了,这个链接上说的也可以参考下。
解开者 2017-08-03
  • 打赏
  • 举报
回复
第一个,Stream长度是有限制的,在java.lang.stream.Nodes类中明确定义:
    /**
     * The maximum size of an array that can be allocated.
     */
    static final long MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
第二个,虽然通过了第一个校验,但限于IntStream内部是以数组保存元素,且数组是以2的幂等方式扩大;因为Integer.MAX_VALUE-9对2取对数为31,会导致IntStream尝试计算1 << 31造成整数循环溢出;这里最大的合理值为Integer.MAX_VALUE / 2 + 1 但实际上,这个值通常也是过不去的,因为一般jvm开不出这么大内存。2^31byte=2GB,大于jvm的默认设置。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧