在 Java 内存中,byte 或 int 之间没有区别——两者都将表示为 4 个字节。
对于 Chronicle Map 是否存在差异,即 Chronicle Map 将字节值存储为 8 位还是仍然使用 32?
如果 byte 是一个对象属性,同样的问题。
在 Java 内存中,byte 或 int 之间没有区别——两者都将表示为 4 个字节。
对于 Chronicle Map 是否存在差异,即 Chronicle Map 将字节值存储为 8 位还是仍然使用 32?
如果 byte 是一个对象属性,同样的问题。
在原始地图实现(fastutil、koloboke、gs、hppc)中,byte
值被实现为一个单独的byte[]
数组,因此它们实际上只占用 1 个字节。如果 abyte
是另一个堆上 Java 对象的字段(它是一个 Map 值),实际上,对象大小向上舍入到 8 字节边界,因此单个byte
字段可以“占用”8 个字节。但更常见的是,它“占用”了 0 个字节,因为该字段被放置在已经存在的对齐孔中。
对于 Chronicle Map,一个值可以自由地为 1 字节大小。(甚至是 0 字节,这就是ChronicleSet
当前的实现方式——ChronicleMap
具有 0 字节的虚拟值。)对于所有 Chronicle Map 版本(2、3)都是如此。
编辑——回答评论。
如果您有一个恒定大小的结构,例如 6 字节字段,最简单有效的方法 - 使用数据值生成机制:
interface MyValue {
byte getA(); void setA(byte a);
byte getB(); void setB(byte b);
byte getC(); void setC(byte c);
byte getD(); void setD(byte d);
byte getE(); void setE(byte e);
byte getF(); void setF(byte f);
}
map = ChronicleMapBuilder.of(Key.class, MyValue.class).entries(1000).create();
// Chronicle Map 2 syntax
MyValue value = DataValueClasses.newDirectReference(MyValue.class);
try (Closeable handle = map.getUsingLocked(key, value)) {
// access the value here
System.out.println(value);
}
// Chronicle Map 3 syntax
try (ExternalMapQueryContext<Key, MyValue, ?> q = map.queryContext(key)) {
// if not sure the key is present in the map, check q.entry() != null
MyValue value = q.entry().value().get();
// access the value here
System.out.println(value);
}
每个值将占用 6 个字节。
我想我知道答案。至少在 2.3.8 版本中,堆外值将是 1 个字节对应一个字节(在 SerializationBuilder 类中完成的工作)。