从 Java 5 开始,我们已经对原始类型进行了装箱/拆箱,以便将int其包装为 be java.lang.Integer,等等。
int
java.lang.Integer
我最近看到很多新的 Java 项目(如果不是 6, 肯定 需要至少版本 5 的 JRE)使用int而不是java.lang.Integer,尽管使用后者更方便,因为它有一些用于转换的辅助方法long价值观等。
long
为什么有些人 仍然 在 Java 中使用原始类型?有什么实实在在的好处吗?
在 Joshua Bloch 的 EffectiveJava 的第 5 项:“避免创建不必要的对象”中,他发布了以下代码示例:
public static void main(String[] args) { Long sum = 0L; // uses Long, not long for (long i = 0; i <= Integer.MAX_VALUE; i++) { sum += i; } System.out.println(sum); }
运行时间为 43 秒。将 Long 带入原语可以将其缩短到 6.8 秒……如果这是我们使用原语的任何迹象。
缺乏原生价值平等也是一个问题(.equals()与此相比相当冗长==)
.equals()
==
对于 biziclop:
class Biziclop { public static void main(String[] args) { System.out.println(new Integer(5) == new Integer(5)); System.out.println(new Integer(500) == new Integer(500)); System.out.println(Integer.valueOf(5) == Integer.valueOf(5)); System.out.println(Integer.valueOf(500) == Integer.valueOf(500)); } }
结果是:
false false true false
编辑 为什么(3)返回true和(4)返回false?
true
false
因为它们是两个不同的对象。最接近零的 256 个整数 [-128; 127] 被 JVM 缓存,因此它们返回相同的对象。但是,超出该范围,它们不会被缓存,因此会创建一个新对象。为了让事情变得更复杂,JLS 要求 至少 缓存 256 个享元。JVM 实现者可以根据需要添加更多内容,这意味着这可以在缓存最近的 1024 并且所有这些都返回 true 的系统上运行…#awkward