0

在 Java 内存中,byte 或 int 之间没有区别——两者都将表示为 4 个字节。

对于 Chronicle Map 是否存在差异,即 Chronicle Map 将字节值存储为 8 位还是仍然使用 32?

如果 byte 是一个对象属性,同样的问题。

4

2 回答 2

0

在原始地图实现(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 个字节。

于 2015-10-22T19:54:33.543 回答
0

我想我知道答案。至少在 2.3.8 版本中,堆外值将是 1 个字节对应一个字节(在 SerializationBuilder 类中完成的工作)。

于 2015-10-22T19:30:49.840 回答