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,或者使用相同的东西填充它们,则哈希码将是相同的.
从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,因此,哈希码始终相同.哈希码取决于缓冲区的内容,而不是用于表示缓冲区的物理对象.