隨着DNA的提及,擁有預填充緩衝區並使用ByteBuffer.put(ByteBuffer)
可能是最快的便攜方式。如果這是不實際的,你可以做這樣的事情趁要麼Arrays.fill
或Unsafe.putLong
的適用情況:
public static void fill(ByteBuffer buf, byte b) {
if (buf.hasArray()) {
final int offset = buf.arrayOffset();
Arrays.fill(buf.array(), offset + buf.position(), offset + buf.limit(), b);
buf.position(buf.limit());
} else {
int remaining = buf.remaining();
if (UNALIGNED_ACCESS) {
final int i = (b << 24) | (b << 16) | (b << 8) | b;
final long l = ((long) i << 32) | i;
while (remaining >= 8) {
buf.putLong(l);
remaining -= 8;
}
}
while (remaining-- > 0) {
buf.put(b);
}
}
}
設置UNALIGNED_ACCESS
需要你的JRE實現和平臺的一些知識。在使用JNA(提供Platform.ARCH
作爲訪問os.arch
系統屬性的方便,規範方法)時,我將如何爲Oracle JRE進行設置。
/**
* Indicates whether the ByteBuffer implementation likely supports unaligned
* access of multi-byte values on the current platform.
*/
private static final boolean UNALIGNED_ACCESS = Platform.ARCH.startsWith("x86");
您可以更詳細地解釋用例嗎?你從哪裏獲得bytebuffer? – jontro
爲什麼你認爲你需要將緩衝區清零? – EJP
它是直接緩衝區嗎?如果不是,那麼'ByteBuffer.wrap(new byte [123456]);' –