【问题标题】:How and why other wrapper objects do not use constant pool in java其他包装器对象如何以及为什么不在 Java 中使用常量池
【发布时间】:2017-06-21 13:33:40
【问题描述】:

为了节省内存,Java 会“重用”所有值在以下范围内的包装对象。 所有布尔值(truefalse

所有字节值

\u0000\u007f 的所有字符值(即十进制的0127

-128127 的所有短整型值。 例如:

Integer i1=7;
Integer i2=7;
System.out.println(i1==i2);//true

对于 Double、Long 以及使用常量池有何不同? 例如:

Double d1=7.2;
Double d2=7.2;
System.out.println(d1==d2);//false

【问题讨论】:

  • 常量池中只保存常用的值。长值比小整数少得多,而且在使用双精度值方面根本没有共同的模式。
  • 因为Longs和Doubles很多?
  • 有 2 个可能的布尔值。从 -128 到 127 的范围内有 256 个整数。在这个范围内有多少个双精度数?对许多人来说,选择经常使用的值以便缓存它们并不是一件容易的事。
  • 您的双打示例不一定是这种情况。 API 允许 "(cache) frequently requested values" 的值。

标签: java


【解决方案1】:

浮点数的精度是有限的;但回想一下你在学校的日子;当你学习数学时,你听说过real numbers ...

从这个意义上说,我的回答是对你的一个问题:你能告诉我们在 0.01 和 0.02 之间缓存多少个数字吗?!

当然:答案是 - 在任意两个浮点数之间存在无限个实数。因此,绝对没有方法可以缓存这些数字。

【讨论】:

    【解决方案2】:

    在我看来,DoubleFloat 有很多价值观,不能让他们保留现金,换句话说,这是无效的。

    LongBoolean 也有他们的现金(在 Boolean 的情况下,它是简单的两个最终变量 falsetrue

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多