java.nioのByteBufferについてちょっと調べてみた。
ByteBufferにはダイレクトバッファーと非ダイレクトバッファーの2種類がある。
ダイレクトバッファーはJVMの外の領域にメモリを確保し、非ダイレクトバッファーはメモリをJVM内に取る。
話ではダイレクトバッファーでも補助配列が使えるという事だったが、調べてみたところそれは嘘であった。
JavaDocからは見えないがByteBufferは実は抽象クラスでそのインスタンスを作成する事はできない。ダイレクトバッファーか非ダイレクトバッファーかで作成されるインスタンスのクラスが違う。DirectByteBufferがダイレクトバッファーのクラスで、非ダイレクトバッファーはHeapByteBuffer だ。
そして、array()関数で返される補助配列というのは、補助配列と呼ぶにはお粗末なHeapByteBufferのバッファー部分本体だ。ぬぁにが補助だ。本体配列と呼べ。
このバッファーはDirectByteBufferではnullになっているので、エラーが出る。
よって、JAVAからDirectByteBufferの値を変更するにはput関数を通さなくてはならず、関数のオーバーヘッドがある上に、そもそもput(配列)で配列を保持するならそもそも外部に領域を取った意味が無い。JNIとかでネイティブコードを実行するなら早くなるだろうが。
というわけで、配列最強が結論。