【问题标题】:why are there Primitive datatype in Java? [duplicate]为什么Java中有原始数据类型? [复制]
【发布时间】:2013-01-06 19:34:57
【问题描述】:

可能重复:
When we have wrappers classes, why primitives are supported?

如果有让Java成为纯面向对象语言的Wrapper类,那为什么还有可以在Java中使用的Primitive数据类型???

【问题讨论】:

标签: java types primitive


【解决方案1】:

存在原始数据类型的主要原因是,创建对象、分配堆的成本太高,而且会降低性能。您可能知道 int、float 等原始数据类型是最常用的,因此将它们作为对象会极大地影响性能。所以 Java 设计者认为最好把它做成非对象。 是的,如果你准备在性能上妥协一点,但你需要更多的 OOP 设施,包装器就存在。因此,在这种情况下,您可以使用包装器。希望这些信息对您有所帮助。

【讨论】:

  • 创建对象,分配堆的成本太高,而且有性能损失 =>你有参考吗?有罚款,但不是那么高。
  • 例如Goetz states 在HotSpot 1.4.2 及更高版本中new Object() 的通用代码路径约为10 条机器指令。
  • 原始类型表示单个值,而不是复杂对象。尽管 Java 在其他方面完全是面向对象的,但原始类型却不是。它们类似于大多数其他非面向对象语言中的简单类型。这样做的原因是效率。将原始类型转换为对象会大大降低性能 Java 的完整参考。
  • @assylias,是的,惩罚可能更少,但是在创建更多 int、float 包装器的上下文中,您可以观察到惩罚
【解决方案2】:

出于性能原因。在其他一些语言中,如SmallTalk,int 或 char 等类型也是对象,并且可以在它们上调用方法。这在理论上更正确,但当前的实现运行速度较慢。原始类型是纯度和性能之间的折衷。

在更必要的地方(可能为空值或与集合框架一起使用),Java 提供了包装类,如 java.lang.Integer 和类似的。

【讨论】:

    【解决方案3】:

    为了效率。原始类型的变量直接包含值;非原始类型的变量是引用,引用存储在内存中其他位置的对象。

    每次需要使用包装类型的值时,JVM 都需要在内存中查找对象以获取该值。原始类型不需要这样做,因为变量包含值本身,而不是对包含该值的对象的引用。

    但是,这并不能解释为什么原始类型需要在 Java 编程语言中显式可见。 Java 语言和 JVM 的设计者可以选择对语言本身隐藏原始类型,这样您就可以将一切都视为对象;然后编译器可以在后台将其转换为更有效的原始类型。

    在 JVM 上运行的一些较新的编程语言(Groovy、Scala 和其他)可以让您做到这一点:在语言本身中,一切看起来都像一个对象,例如您可以在其上调用方法,但在编译器下面将它们转换为原语。

    我猜在 Java 语言被开发的时候(1990 年代前半期)人们并没有想到这一点,现在对语言进行彻底的改变来允许这样做已经太晚了。

    【讨论】:

      猜你喜欢
      • 2011-06-03
      • 2010-11-01
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      • 2012-06-18
      • 2011-07-21
      • 2014-07-06
      • 2014-01-26
      相关资源
      最近更新 更多