为什么ByteBuffers hashCodes一样?

5Yr*_*DBA 6 java debugging buffer bytebuffer hashcode

我有一个像这样的类构造函数:

public JavoImageCorrectedDataHeader()
    {
        ByteBuffer buffer = ByteBuffer.allocate(this.size());
        buffer.order(java.nio.ByteOrder.LITTLE_ENDIAN);
        setByteBuffer(buffer, 0);
        System.out.println("buffer.hasCode=" + buffer.hashCode());
    }
Run Code Online (Sandbox Code Playgroud)

在我的其他课程中,我通过使用在不同的位置和时间创建了上述类的许多实例

new JavoImageCorrectedDataHeader()
Run Code Online (Sandbox Code Playgroud)

然后,我预计它将为它们打印出不同的hashCode.但我实际上看到打印出相同的hashCode:

buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
buffer.hasCode=1742602241
Run Code Online (Sandbox Code Playgroud)

我必须想念如何使用ByteBuffer.

Mic*_*ael 11

来自javadoc:

字节缓冲区的哈希码仅取决于其剩余的元素; 也就是说,来自position()的元素直到(包括)limit() - 1处的元素.

因为缓冲区哈希码是依赖于内容的,所以不建议使用缓冲区作为哈希映射或类似数据结构中的键,除非已知它们的内容不会改变.

如果您没有填充ByteBuffers,或者使用相同的东西填充它们,则哈希码将是相同的.


Ale*_*ood 5

ByteBuffer.java源代码:

public int hashCode () {
    int hashCode = get(position()) + 31;
    int multiplier = 1;
    for (int i = position() + 1; i < limit(); ++i) {
        multiplier *= 31;
        hashCode += (get(i) + 30)*multiplier;
    }
    return hashCode;
}
Run Code Online (Sandbox Code Playgroud)

在您当前的实现中,position() 始终返回0,因此,哈希码始终相同.哈希码取决于缓冲区的内容,而不是用于表示缓冲区的物理对象.