9

在我的一个课程中,我有一个 type 字段Character。我更喜欢它,char因为有时该字段“没有价值”并且null对我来说是表示这种(缺乏)信息的最干净的方式。

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

我的第一个赌注是 achar占用两个字节,而 aCharacter是一个对象,因此它需要更多才能支持它的生命周期。但是我知道像Integer,之类的盒装原语Character不是普通的类(想想装箱和拆箱),所以我想知道 JVM 是否可以在后台进行某种优化。

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

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

4

3 回答 3

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),因为此方法可能会通过缓存频繁请求的值来显着提高空间和时间性能。

于 2013-03-22T09:48:39.200 回答
1

Use int instead. Use -1 to represent "no char".

Lots of precedence of this pattern, for example int read() in java.io.Reader

于 2013-03-22T16:07:11.340 回答
0

正如您所说,一个Character对象可以是null,因此它必须在 RAM 中占据比char不能为 null 的常规更多的位置:在某种程度上,Characters 是 s 的超集char

However, in a given part of your code, the JIT compiler might be able to detect that you Character is never null an is always used as a regular char and optimize that part so that your Character uses no more RAM or execution is no slower. I'm just speculating on this very point, though, I don't know if a JIT can actually perform this precise optimization.

于 2013-03-22T09:54:49.953 回答