在我的一个课程中,我有一个Character
类型的字段。我更喜欢它char
,因为有时候这个领域没有价值" null
以最简洁的方式表达这种(缺乏)信息。{/ p>
但是我想知道这种方法的内存占用情况。我处理成千上万的物品,这两种选择之间微不足道的差异现在值得进行一些调查。
我的第一个赌注是char
需要两个字节,而Character
是一个对象,因此需要更多才能支持其生命周期。但是我知道像Integer
,Character
之类的盒装原语不是普通的类(想想装箱和拆箱),所以我想知道JVM是否可以在幕后进行某种优化。
此外,Character
垃圾是否像其他东西一样被收集或者生命周期不同?它们是从共享存储库汇集的吗?这个标准或JVM实现依赖吗?
我无法在互联网上找到有关此问题的任何明确信息。你能指点我一些信息吗?
答案 0 :(得分: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)
,因为此方法可能会通过频繁缓存来显着提高空间和时间性能要求的价值。
答案 1 :(得分:0)
正如你所说,Character
对象可以是null
,因此它必须在RAM中占据比常规char
更多的位置,而Character
不能为空:在某种程度上,{{ 1}}是char
s的超集。
但是,在代码的给定部分中,JIT编译器可能能够检测到您Character
永远不会为null并且始终用作常规char
并优化该部分以便您的Character
不再使用RAM或执行速度不慢。我只是在猜测这一点,但我不知道JIT是否可以实际执行这种精确的优化。
答案 2 :(得分:0)
请改用int
。使用-1
表示“无字符”。
此模式的许多优先级,例如int read() in java.io.Reader