为什么ByteBuffer不保留putDouble和getDouble的索引?

Kir*_*rby 4 java bytebuffer

我在理解ByteBuffer以下场景中的语义时遇到困难:

int sizeOfDouble = 8;
int numberOfDoubles = 4;
ByteBuffer testBuf = ByteBuffer.allocateDirect(sizeOfDouble*numberOfDoubles);

testBuf.putDouble(0, 1.0);
testBuf.putDouble(1, 2.0);
testBuf.putDouble(2, 3.0);
testBuf.putDouble(3, 4.0);

for (int i = 0; i < numberOfDoubles; ++i) {
    System.out.println("testBuf[" + i + "]: " + testBuf.getDouble(i));
}
Run Code Online (Sandbox Code Playgroud)

我希望看到我刚刚把ByteBuffer它打印到屏幕上的值.相反,我得到这个输出:

testBuf[0]: 4.959404759574682E-4
testBuf[1]: 32.50048828125
testBuf[2]: 32.125
testBuf[3]: 4.0
Run Code Online (Sandbox Code Playgroud)

第三个索引的值似乎符合我的预期:4.0.但为什么值和索引0,1和2与我插入的值(分别为1.0,2.0和3.0)不匹配?

我怀疑我误解了一些有关如何ByteBuffer工作的东西,但我无法在javadoc中找到它.

das*_*ght 5

这是因为您的代码将索引视为doubles 数组中的索引.初始写入成功完成; 然后第二个写入除了第一个之外的字节; 第三个写再次覆盖字节,依此类推.最后一次写入的结果不会被覆盖,因此4.0完整无缺.

第一个参数表示缓冲区内的字节数组的索引,因此您需要将其乘以sizeOfDouble:

testBuf.putDouble(0*sizeOfDouble, 1.0);
testBuf.putDouble(1*sizeOfDouble, 2.0);
testBuf.putDouble(2*sizeOfDouble, 3.0);
testBuf.putDouble(3*sizeOfDouble, 4.0);

for (int i = 0; i < numberOfDoubles; ++i) {
    System.out.println("testBuf[" + i + "]: " + testBuf.getDouble(sizeOfDouble*i));
}
Run Code Online (Sandbox Code Playgroud)

演示.