如果我在一个类中需要8个布尔成员变量,Java是否有效地将它们全部放在一个字节中?或者它会为每个使用一个字节?换句话说,内存占用的不同之处在于:
boolean a;
boolean b;
boolean c;
boolean d;
boolean e;
boolean f;
boolean g;
boolean h;
VS
public static final int a = 0x01;
public static final int b = 0x02;
public static final int c = 0x04;
public static final int d = 0x08;
public static final int e = 0x10;
public static final int f = 0x20;
public static final int g = 0x40;
public static final int h = 0x80;
byte flags;
我问,因为我将实例化这些对象的很多。因此,如果需要1个字节而不是8个字节的内存将会有明显的节省。
更新:这绝对类似于列出布尔值存储在int中的链接问题(感谢您提供这些链接,抱歉我在询问之前没有找到它们)。这个问题略有不同,因为它提供了使用字节和位标志的特定替代方案。我不知道这是否足以使这个问题不重复。
更新2:我刚刚使用SizeofUtil运行了此操作并找到了以下内容。 8个布尔值需要24个字节/对象或3个字节/布尔值。单字节方法需要10个字节/对象。我会理解8它将字节扩展为本机int(我在64位系统上)。但是其他2个字节是什么?
答案 0 :(得分:7)
Java中布尔值表示的实际信息是一位:1表示true,0表示false。但是,Java规范并未精确定义内存中布尔变量的实际大小。
布尔数据类型只有两个可能的值:true和false。 将此数据类型用于跟踪真/假条件的简单标志。 此数据类型代表一位信息,但其“大小” 不是精确定义的东西。
因此,如果要创建大量布尔值,最好使用byte
。
答案 1 :(得分:3)
阅读主题"How much memory does a boolean consume?"。他们建议BitSet作为大套布尔值的解决方案,但在你的情况下byte
更好地解决问题,因为你没有大量的布尔值,你将拥有大量的布尔值对象。
总结:字节优于8个布尔值。
答案 2 :(得分:0)
它取决于VM如何实现内存中的字段。
但常识说它更容易实现对象中自己的内存插槽中的每个字段,并且它的大小也取决于VM,可能是一个字节或更大的东西(我猜是int )。
您可以通过创建大量这些对象的数组(比方说10M)来测量特定VM的数据,并检查使用了多少内存(例如Runtime API)。
但是当我遇到严重的记忆问题时,我只会担心这一点。使用布尔值,您可以在需要时将其重新实现为标记字段(假设您不使用直接字段访问并使用 getters 来丢弃代码) )。
答案 3 :(得分:0)
如果查看JDK 8的Spliterator
,他们仍在使用位掩码,我能想到的唯一原因是内存效率:
public static final int DISTINCT = 0x00000001;
public static final int SORTED = 0x00000004;
public static final int ORDERED = 0x00000010;
public static final int SIZED = 0x00000040;
那么它应该是一个很好的方法。