Java字符与char:内存使用情况如何?
在我的一个课程中,我有一个Character
类型的字段。我比char
更喜欢它,因为有时候该字段有“没有价值”,并且null
与我联系是表示这种(缺少)信息的最简洁的方式。Java字符与char:内存使用情况如何?
但是我想知道这种方法的内存占用量。我正在处理数十万个对象,而现在可以忽略的两个选项之间的差异值得进行一些调查。
我的第一个打赌是char
需要两个字节,而Character
是一个对象,所以它需要更多的支持其生命周期。但我知道像Integer
,Character
等盒装原语不是普通的类(想想拳击和拆箱),所以我不知道JVM是否可以在引擎盖下进行某种优化。
此外,是Character
的垃圾收集像其他的东西或有不同的生命周期?他们是从共享存储库中汇集的吗?这是标准还是JVM实现依赖?
我无法在Internet上找到有关此问题的任何明确信息。你能指点我一些信息吗?
如果您使用的Character
来然后创建人物喜欢使用
Character.valueOf('c'); // it returns cached value for 'c'
Character c = new Character('c');// prefer to avoid
以下是javadoc中的摘录。
如果不需要新的Character实例,这种方法
Character.valueOf()
一般应优先使用构造Character(char)
,因为此方法可能通过缓存经常请求的值以获得更好的显著空间和时间性能。
正如你所说,一个Character
对象可以是null
,所以它必须采取更多的RAM地方比常规char
不能为空:在某种程度上,Character
s为的char
秒的超集。
然而,在你的代码的给定部分,JIT编译器可能能够检测到您Character
是永远不会空的总是作为一个普通char
和优化部分,使您的Character
不使用更多的内存或执行并不慢。我只是在猜测这一点,但我不知道JIT是否可以实际执行这种精确的优化。
改为使用int
。使用-1
表示“无字符”。
很多这种模式的优先级,例如int read() in java.io.Reader
再次像UmNyobe的评论...我感谢你的好建议,但我自己可以考虑这种解决方法......实际上,一切都可以作为替代模式来完成。但问题不在于此。 – gd1 2013-03-22 20:35:17
不......我在这里谈论的是'int',它可以代表所有的字符,然后是其他的东西,在你的情况下,一个哨兵值“没有字符”。不能将哨兵值误认为任何字符0x0000-0xFFFF。这是一种常见的做法,请参阅'Reader.read()'的javadoc。 – ZhongYu 2013-03-22 21:01:29
好的,我放弃了。没关系。 – gd1 2013-03-22 21:55:21
'\ 0'可以作为一个*没有价值的*字符 – UmNyobe 2013-03-22 09:40:31
当然,我知道这一点。 :)鉴于应用程序域,我甚至可以使用〜,#或一个中文字符,但这不是关键点 – gd1 2013-03-22 09:40:44
基元总是更快,然后对象以及获得更少的内存,因为我们都知道我们更喜欢字符串上的字符数组。 (作为数组在java本身的对象,但它的一个有争议的问题:D) – Freak 2013-03-22 09:51:01