Java字符vs char:内存使用情况如何?



在我的一个类中,我有一个类型为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是否真的可以执行这种精确的优化。

相关内容

最新更新