Nun, ByteBuffer haben noch wichtigere Eigenschaften und Anwendungsbereiche als die Möglichkeit, die JVM um ein paar MB speicher zu bes******en
Ein ByteBuffer hat einige Eigenschaften, die man sonst nur von C-Pointern her kennt, und kommen diesen in mancher Hinsicht sehr nah. Man kann in einem ByteBuffer auch floats speichern, und sogar "gemischte" primitive Datentypen: Z.B. 3 floats, 2 short und 4 ints in einem ByteBuffer unterbringen. Sowas wie "Memory Mapped Files" sind auch ein Fall, wo man erstmal nur mit ByteBuffern zu tun hat. Man kann damit leicht Daten, die man z.B. aus einer Datei liest, wahlweise als Big- oder Little Endian interpretieren. Sowas wie "slice" bietet außerdem die Möglichkeit, "unter-Buffer" zu definieren (schon fast entsprechend Pointerarithmetik in C, in mancher Hinsicht sogar noch "mächtiger"). Insgesamt gibt es viele stellen, wo sie praktisch sein können.
Ein konkreter Bereich, wo sie sehr häufig eingesetzt werden, ist bei JNI-Wrapper-Bibliotheken für C-Libs. Sowas wie JOGL oder LWJGL verwenden fast überall ByteBuffer/IntBuffer/FloatBuffer, wo man eigentlich byte[]/int[]/float[] erwarten würde: Auf der C-Seite ist der Zugriff auf
direct Buffers viel einfacher (und hat einige Glitches NICHT, die es bei normalen Arrays eben gibt). Abgesehen davon kann man auch Speicher, den man in C reserviert hat, in Form eines ByteBuffers nach Java rüberreichen.