【问题标题】:Java Character vs char: what about memory usage?Java Character vs char:内存使用情况如何?
【发布时间】:2013-03-22 09:38:11
【问题描述】:

在我的一个课程中,我有一个Character 类型的字段。我更喜欢它而不是char,因为有时该字段“没有价值”,而null 对我来说是表示这种(缺乏)信息的最干净的方式。

但是我想知道这种方法的内存占用。我正在处理数十万个对象,这两个选项之间可以忽略不计的差异现在可能值得进行一些调查。

我的第一个赌注是 char 占用两个字节,而 Character 是一个对象,因此它需要更多才能支持其生命周期。但我知道 IntegerCharacter 等盒装原语不是普通的类(想想装箱和拆箱),所以我想知道 JVM 是否可以在后台进行某种优化。

此外,Characters 的垃圾是否像其他东西一样被收集或具有不同的生命周期?它们是从共享存储库中汇集的吗?是这个标准还是 JVM 实现依赖?

我无法在 Internet 上找到有关此问题的任何明确信息。你能告诉我一些信息吗?

【问题讨论】:

  • \0 可以用作 no-value 字符
  • 当然,我知道这一点。 :) 考虑到应用程序域,我什至可以使用 ~、# 或汉字,但这不是重点
  • 原语总是比对象更快,而且内存更少,因为我们都知道我们更喜欢字符串上的字符数组。(作为 java 中的数组本身是一个对象,但它是一个有争议的问题:D)

标签: java performance memory


【解决方案1】:

如果你使用Character 来创建角色,那么更喜欢使用

Character.valueOf('c'); // it returns cached value for 'c' 

Character c = new Character('c');// prefer to avoid

以下是 javadoc 的摘录。

如果不需要新的 Character 实例,则通常应优先使用此方法 Character.valueOf() 而不是构造函数 Character(char),因为此方法可能会通过缓存频繁请求的值来显着提高空间和时间性能。

【讨论】:

  • 其实我是通过装箱隐式创建的。
  • @gd1 装箱将使用缓存值(如果可用)。
  • Character 需要用 javap 检查,但Integer 使用的是valueOf
【解决方案2】:

请改用int。使用-1 表示“无字符”。

这种模式的很多优先级,例如int read() in java.io.Reader

【讨论】:

  • 再次像 UmNyobe 的评论...我感谢您的好建议,但我自己可以考虑这种解决方法...实际上一切都可以作为替代模式来完成。然而,问题与此无关。
  • no... 我在这里说的是int,它可以代表所有字符,然后是其他东西,在你的情况下,一个标记值“no char”。哨兵值不能被误认为是任何字符 0x0000-0xFFFF。这是一种常见的做法,请参阅Reader.read() 的 javadoc。
【解决方案3】:

正如您所说,Character 对象可以是 null,因此它必须在 RAM 中占据比不能为空的常规 char 更多的位置:在某种程度上,Characters 是chars.

但是,在代码的给定部分,JIT 编译器可能能够检测到您的 Character 永远不会为空,并且始终用作常规 char 并优化该部分,以便您的 Character 使用没有更多的 RAM 或执行速度不会变慢。不过,我只是在推测这一点,我不知道 JIT 是否真的可以执行这种精确的优化。

【讨论】:

    猜你喜欢
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 2011-02-14
    相关资源
    最近更新 更多