将字节值存储在Map中是否有意义还是仍然使用4个字节?

时间:2015-10-22 15:33:45

标签: dictionary chronicle chronicle-map

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

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

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

2 个答案:

答案 0 :(得分:0)

我想我知道答案。至少在2.3.8版本中,一个字节的offheap值为1个字节(在SerializationBuilder类中完成的工作)。

答案 1 :(得分:0)

在原始映射实现中(fastutil,koloboke,gs,hppc)byte值实现为单独的byte[]数组,因此它们实际上只占用1个字节。如果byte是另一个堆上Java对象(它是Map值)的字段,实际上,对象大小向上舍入到8字节边界,因此单个byte字段可以“取“8个字节。但更常见的是,它“占用”0个字节,因为该字段位于已存在的对齐孔中。

对于Chronicle Map,一个值可以自由地为1个字节。 (甚至0字节,这就是当前ChronicleSet的假设 - ChronicleMap具有0字节的虚拟值。)对于所有Chronicle Map版本(2,3)都是如此。

编辑 - 回答评论。

如果你有一个不断大小的结构e。 G。 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个字节。

相关问题