在我的一个类中,我有一个类型为Character
的字段。我更喜欢它而不是char
,因为有时字段"没有值",而null
对我来说是表示这种(缺乏)信息的最干净的方式。
然而,我想知道这种方法的内存占用。我正在处理成千上万的对象,这两个选项之间微不足道的差异现在可能值得进行一些研究。
我的第一个赌注是char
占用两个字节,而Character
是一个对象,因此它需要更多的字节来支持它的生命周期。但是我知道像Integer
, Character
这样的装箱原语不是普通的类(想想装箱和拆箱),所以我想知道JVM是否可以在底层做一些优化。
此外,Character
是像其他东西一样收集垃圾还是有不同的生命周期?它们是否来自共享存储库?这取决于标准还是JVM实现?
关于这个问题,我在网上找不到任何明确的信息。你能告诉我一些信息吗?
如果你使用Character
创建字符,那么更喜欢使用
Character.valueOf('c'); // it returns cached value for 'c'
Character c = new Character('c');// prefer to avoid
下面是javadoc的节选
如果不需要新的Character实例,通常应该优先使用
Character.valueOf()
方法,而不是构造函数Character(char)
,因为通过缓存频繁请求的值,该方法可能会产生更好的空间和时间性能。
用int
代替。使用-1
表示"no char"
此模式有很多优先级,例如int read() in java.io.Reader
如您所述,Character
对象可以是null
,因此它必须在RAM中占据比不能为空的常规char
更多的位置:在某种程度上,Character
s是char
s的超集。
然而,在代码的给定部分,JIT编译器可能能够检测到您的Character
永远不会为空,并且总是作为常规char
使用,并优化该部分,以便您的Character
不使用更多的RAM或执行速度不会变慢。我只是在推测这一点,但是,我不知道JIT是否真的可以执行这种精确的优化。