For byte[]
特别是你可以使用MethodHandles::byteArrayViewVarHandle
:
public static void main(String[] args) {
VarHandle varHandle = MethodHandles.byteArrayViewVarHandle(long[].class,
ByteOrder.nativeOrder());
byte[] array = new byte[32];
printArray(array);
varHandle.set(array, 1, 5);
printArray(array);
System.out.println(varHandle.get(array, 1));
}
private static void printArray(byte[] array) {
System.out.println(Arrays.toString(array));
}
您必须使用 VarHandles 跳过一些障碍,才能使其与 Unsafe 一样快;
- 确保 VarHandle 本身是常量,这可以通过将其放入静态最终字段并从那里访问它来完成。
- 确保 VarHandle 调用准确。这里这意味着
由于 VarHandle 除外,因此将第二个参数强制转换为 long
也长。 (在最新的JDK中你可以使用
VarHandle::withInvokeExactBehavior
来强制执行)。
通过将 VarHandle set 和 get 调用包装在执行强制转换的帮助器方法中,可以使这变得更容易:
private static final VarHandle LONG_ARR_HANDLE
= MethodHandles.byteArrayViewVarHandle(long[].class,
ByteOrder.nativeOrder());
public static void setLong(byte[] bytes, int index, long value) {
LONG_ARR_HANDLE.set(bytes, index, value);
}
public static long getLong(byte[] bytes, int index) {
return (long) LONG_ARR_HANDLE.get(bytes, index);
}