【发布时间】:2014-05-06 10:04:14
【问题描述】:
为什么在 Java 中的其他所有内容都是 Object 时支持 Primitives 数据类型。尽管 Java 确实提供了所有原始数据类型的 Wrapper 类
【问题讨论】:
-
在没有公认的“100% 面向对象”定义的情况下,这不是一个真正的问题,并且“主要基于意见”。
标签: java
为什么在 Java 中的其他所有内容都是 Object 时支持 Primitives 数据类型。尽管 Java 确实提供了所有原始数据类型的 Wrapper 类
【问题讨论】:
标签: java
我们使用原语是因为它们速度很快。 这是Why do people still use primitive types in Java?帖子的答案,供快速参考
在 Joshua Bloch 的 Effective Java 的第 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() 与 == 相比相当冗长)
对于 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));
}
}
结果:
C:\Documents and Settings\glow\My Documents>java biziclop
false
false
true
false
【讨论】:
== 是否丢失。它只是意味着与equals() 不同的东西;绝对和忠实地同一个对象。我不经常使用它,但我不希望它从语言中删除
Integer.valueOf(5) == Integer.valueOf(5) true 和 Integer.valueOf(500) == Integer.valueOf(500) false 如何?
Integer.valueOf() 提供该值的 Integer,而不是 int'. However it caches small values so it truely is the same Integer`
因为自动装箱....http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html。你会在那里找到答案。
【讨论】:
另一种解释,取自here:
并非 Java 中的所有内容都是对象。有一组特殊的数据 将经常使用的类型(也称为原始类型) 你的编程。出于性能原因,Java 的设计者 语言决定包含这些原始类型。
使用 new 创建对象效率不高,因为 new 会 将对象放在堆上。这种方法对 小而简单的变量。而不是使用 new 创建变量, Java 可以使用原始类型来创建自动变量 不是参考。变量保存值,它位于 堆栈,因此效率更高
【讨论】: