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

问题描述:

在我的一个课程中,我有一个Character类型的字段。我比char更喜欢它,因为有时候该字段有“没有价值”,并且null与我联系是表示这种(缺少)信息的最简洁的方式。Java字符与char:内存使用情况如何?

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

我的第一个打赌是char需要两个字节,而Character是一个对象,所以它需要更多的支持其生命周期。但我知道像Integer,Character等盒装原语不是普通的类(想想拳击和拆箱),所以我不知道JVM是否可以在引擎盖下进行某种优化。

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

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

+0

'\ 0'可以作为一个*没有价值的*字符 – UmNyobe 2013-03-22 09:40:31

+0

当然,我知道这一点。 :)鉴于应用程序域,我甚至可以使用〜,#或一个中文字符,但这不是关键点 – gd1 2013-03-22 09:40:44

+0

基元总是更快,然后对象以及获得更少的内存,因为我们都知道我们更喜欢字符串上的字符数组。 (作为数组在java本身的对象,但它的一个有争议的问题:D) – Freak 2013-03-22 09:51:01

如果您使用的Character来然后创建人物喜欢使用

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

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

以下是javadoc中的摘录。

如果不需要新的Character实例,这种方法Character.valueOf()一般应优先使用构造Character(char),因为此方法可能通过缓存经常请求的值以获得更好的显著空间和时间性能。

+0

其实,我通过拳击隐式创建它。 – gd1 2013-03-22 09:50:11

+1

@gd1装箱将使用缓存值(如果可用)。 – assylias 2013-03-22 09:52:12

+0

你需要用javap检查'Character',但是用'Integer'来检查'valueOf'。 – 2013-03-22 09:54:42

正如你所说,一个Character对象可以是null,所以它必须采取更多的RAM地方比常规char不能为空:在某种程度上,Character s为的char秒的超集。

然而,在你的代码的给定部分,JIT编译器可能能够检测到您Character是永远不会空的总是作为一个普通char和优化部分,使您的Character不使用更多的内存或执行并不慢。我只是在猜测这一点,但我不知道JIT是否可以实际执行这种精确的优化。

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

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

+0

再次像UmNyobe的评论...我感谢你的好建议,但我自己可以考虑这种解决方法......实际上,一切都可以作为替代模式来完成。但问题不在于此。 – gd1 2013-03-22 20:35:17

+0

不......我在这里谈论的是'int',它可以代表所有的字符,然后是其他的东西,在你的情况下,一个哨兵值“没有字符”。不能将哨兵值误认为任何字符0x0000-0xFFFF。这是一种常见的做法,请参阅'Reader.read()'的javadoc。 – ZhongYu 2013-03-22 21:01:29

+0

好的,我放弃了。没关系。 – gd1 2013-03-22 21:55:21