Java减小了对象的大小

时间:2015-04-12 11:10:03

标签: java char boolean

我正在创建一个trie,我的应用程序将在其中保存。 Trie将拥有大量节点,我正在考虑如何减少空间使用。 因为我会使用trie来减少DAWG算法的数量,但据我所知,这还不够。

这是一个节点类

class Node{
  char letter;
  boolean EOW; // end of word
  Node child; // first child
  Node next; // next Node on this level
}

据我所知,这个类的对象将有14个字节(为char提供2个字节,4个用于布尔变量,2 * 4将保留用于引用)

我认为我可以逐字节替换char。这将节省1个字节。但是我不知道在铸造中需要多少时间。这可能是一个糟糕的设计。

布尔值也需要4个字节,也许你知道我可以用什么来代替布尔值?

所以我需要你帮我减少节点的大小。提前谢谢。

2 个答案:

答案 0 :(得分:2)

如果letter只需要5位且eow一位,则可以将它们打包在一个byte中以节省内存。

char letter = ...;
boolean eow = ...;

byte packed = (byte) ((eow ? 0b10_0000 : 0) | letter);

letter = (char) (packed & 0b1_1111);
eow = (packed & 0b10_0000) != 0;

答案 1 :(得分:1)

如果你不需要一半的UTF-16字符,你可以使用letter的最高位作为EOW标记。

例如,此处eoWletterA变量的字母为' a'用EOW位编码:

char eoWletterA = 'a' + 0x8000;
char letter = (char) (eoWletterA & 0x7FFF);
boolean eow = BigInteger.valueOf(eoWletterA).testBit(15);

你的trie应该正确封装。确保在将角色存储到角色时不会意外设置EOW位。

更新:请注意,从节点中删除boolean变量可能会或可能不会对JVM中Node对象的内存占用产生影响。您可以使用以下工具检查对象内存占用量:https://stackoverflow.com/a/52682/1207523