【问题标题】:When we have wrappers classes, why primitives are supported?当我们有包装类时,为什么要支持原语?
【发布时间】:2010-01-14 19:37:30
【问题描述】:

我们在 java 中有包装类,例如 Interger、Float.. 为什么它仍然支持阻止 java 成为完全面向对象的语言的ng原语?

【问题讨论】:

    标签: java


    【解决方案1】:

    包装器,作为对象,被放置在堆中。基元只是“值”并进入堆栈。这更有效,因为对于堆中的包装原语,您(至少)需要值(在堆栈中)对包装器对象的引用。

    这种性能提升是否重要取决于您在做什么。对于繁重的数值工作,肯定是这样,但对于 99% 的东西来说,这是相当烦人的。一方面,您无论如何都不能将原语存储在 Collection 中;他们被自动装箱。因此,存储大量它们的唯一方法是使用普通数组,这反过来会导致其他类型的低效率(例如,如果您需要调整它们的大小)。

    【讨论】:

    • 除了存储还有其他原因吗?
    • 我不是 100% 确定内部是如何工作的,但我相信要使用数字计算任何东西,机器必须首先从包装器中提取值(拆箱),这需要至少有一些工作。但是 JIT 运行时优化可能在这里发挥了作用,因此在实践中差异可能非常微不足道,即使在数字密集型程序中也是如此。应该对此进行测量以确定。
    【解决方案2】:

    因为原语在内存和 CPU 处理方面更轻、更高效。

    【讨论】:

    • 我们在使用移动/手持设备时必须考虑到这一点。
    • 但也请考虑在特定情况下它是否具有 10 % 或 0.00001 % 的影响。仅在重要时进行优化。
    【解决方案3】:

    一个词:性能。

    包装器类型也是不可变的,例如,如果想将一种包装器类型用于循环计数器,则成本会更高。

    JVM 也有用于直接对原语进行算术运算的操作码。

    【讨论】:

      猜你喜欢
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-04
      • 2014-08-04
      • 1970-01-01
      • 2023-01-24
      相关资源
      最近更新 更多