对于标准库中可用的Optional<Boolean>
和true
值,似乎没有任何false
类型的缓存对象。我在某处错过了吗?
如果没有这样的物体,我会感到惊讶,因为在我看来,这对于清晰度和性能来说都是如此有用。
如果确实没有这样的物体,为什么会这样?
答案 0 :(得分:2)
在Java 8中,他们改进了对象创建的优化,特别是对于诸如Optional之类的短期对象。 JIT可以做的是使用Escape Analysis通过将字段放在堆栈上来消除短期对象。在Optional<Boolean>
的情况下,这很可能不会超过boolean
请参阅以下有关对象消除的文章,如何检测它不起作用以及您可以对此做些什么。 Java Lambdas and Low Latency
相反的问题,是为什么有OptionalInt,OptionalLong和OptionalDouble?这些可能很有用,只是没有你想象的那么有用。与Boolean
不同,并非所有Integer
,Long
和Double
值都会被缓存,虽然Escape Analisys可以消除对象,但它很昂贵并且可能需要一段时间才能启动,可能从来没有代码运行得不够长。
答案 1 :(得分:1)
没有理由将特定的优化策略修复到API中。 Optional
实例是通过工厂方法获取的,并且有关返回对象标识的行为是故意未指定的。
所以实现可以在内部有一个缓存工具,但也可能是JVM的优化器负责这些事情的情况。今天的JVM在可能的情况下已经在热点中进行了实例创建,但未来的JVM实现也可能为“value based classes”注入缓存或重复数据删除工具。
另见“Why should I not use identity based operations on Optional in Java8?”