Wofür benötigt man ByteBuffer?

H

hüteüberhüte

Gast
Java:
ByteBuffer bb = ByteBuffer.allocate(262144); // 256 KB

Die Frage ist, wofür man ByteBuffer benötigt, warum er sich z.B. nicht vergrößern lässt und ob es Alternativen gibt. :bahnhof:

Liefert array() dasselbe backing array zurück oder wird kopiert?

Wofür sind die Methoden compact, duplicate und slice?

Wie ist equals, hashCode und compareTo implementiert?
 
S

Spacerat

Gast
Sieh' dir einfach mal die Methoden eines ByteBuffers an, dann wirst du es evtl. schon verstehen. Das wichtigste aber dürfte sein, dass man "ByteArrays" (also keine Arrays im Sinne von Java) mit "allocateDirect()" ausserhalb des Java-Heapspace erstellen kann. Solche Buffer belegen dann Systemspeicher und belasten den Heap nur mit ihren obligatorischen 8 Object- sowie zusätzlichen 8 Längenbytes. Dem aufmerksamen Leser fällt sofort auf, dass ByteBuffer die weitaus besseren Arrays sind.
[EDIT]array() liefert genau jene Instanz des Arrays, welche mit "wrap()" übergeben wurde. Wurde der Buffer mit "allocate()" instanziert bekommt man pro Aufruf ein und die selbe Instanz. Buffer, welche per "allocateDirect()" instanziert wurden haben kein Array und ein Aufruf der Methode "array()" führt zu einer Exception.
"slice()" hab' ich noch nicht verwendet aber mit "duplicate()" bekommt man einen Buffer der zwar das selbe Array wie der Originale hat, jedoch kann man an diesem Pointer, Limits, Inhalt usw. beliebig verändern. An dem Originalen ändert sich bis auf den Inhalt jedoch nichts (vllt. könnte man es als besseres "mark/reset" in InputStreams bezeichnen).[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:
H

hüteüberhüte

Gast
[...] ausserhalb des Java-Heapspace erstellen kann.

Ok, also werden sie gemappt. Der Heapspace wird also nicht so groß. Aber er ist doch im Prinzip viel schneller?

ByteBuffer also nur ein Array-Ersatz (mit Methoden, um z.B. auch int und andere Datentypen hinzuzufügen)?
 
Zuletzt bearbeitet von einem Moderator:
S

Spacerat

Gast
Ok, also werden sie gemappt. Der Heapspace wird also nicht so groß. Aber er ist doch im Prinzip viel schneller?
Irrtum. Gemappte Buffer haben ein Array, wie man es von Java her kennt (mit Overhead und allem). DirectBuffer haben ein solches halt nicht, die Verwaltung des Buffers liegt ausschlieslich auf nativer Seite. Daraus folgt: Nein, der Heap ist keineswegs schneller.
ByteBuffer also nur ein Array-Ersatz (mit Methoden, um z.B. auch int und andere Datentypen hinzuzufügen)?
Alles in allem... siehe Edit... "Ersatz" klingt so "billig", ich würde es als leistungsfähige Ergänzug bezeichnen. Versuch' du mal einem Array den Funktionsumfang eines solchen Buffers zu implementieren, da kommst aber ins schwitzen (Erfahrungswert :oops:).
 
Zuletzt bearbeitet von einem Moderator:
H

hüteüberhüte

Gast
Ok, danke. Im ersten Sem. mussten wir auch mal so eine ähnliche Klasse schreiben. Das ist wahrlich keine einfache Aufgabe. :D

Wer erklärt mir jetzt noch die Methoden? In der API ( ByteBuffer (Java Platform SE 6) ) habe ich schon ein bisschen geguckt, aber wirklich durchgeblickt habe ich bis jetzt noch nicht...
 
Zuletzt bearbeitet von einem Moderator:

Marco13

Top Contributor
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Wofür benötigt man die Umgebungsvariablen sowohl in Windows 10 als auch in Mac OS Catalina Java Basics - Anfänger-Themen 19
Fats Waller Wofür stehen diese Konstanten im Java Labyrinth ? Java Basics - Anfänger-Themen 5
J Wofür dienen Interfaces ? Java Basics - Anfänger-Themen 1
F Mehrere Konstruktoren? Wofür? Java Basics - Anfänger-Themen 21
S "%s" oder "%n" - wofür nutzt man das? Java Basics - Anfänger-Themen 4
K Wofür wird heute noch die Stack Klasse in Java genutzt Java Basics - Anfänger-Themen 4
R Wofür abstract? Java Basics - Anfänger-Themen 29
Z This() Wofür Java Basics - Anfänger-Themen 2
T Wofür ist ANT? Java Basics - Anfänger-Themen 5
T Wofür Parser?? Java Basics - Anfänger-Themen 39
V Wofür steht das args / arguments in Main Methode Java Basics - Anfänger-Themen 4
D Was ist ein StringReader und wofür braucht man ihn? Java Basics - Anfänger-Themen 2
N Look & Feel Nimbus wofür? Java Basics - Anfänger-Themen 10
G Wofür com package? + Welche eclipse - Plug Ins? Java Basics - Anfänger-Themen 3
K java syntax: wofür steht super(screen)? Java Basics - Anfänger-Themen 5
J Wofür steht \r? Java Basics - Anfänger-Themen 7
D argv Warum? Wofür? Weshalb? Java Basics - Anfänger-Themen 2
berserkerdq2 Wozu benötigt man den BiPredicate, kann ich nicht einfach eine normale Methode nutzen, statt BiPredicate? Java Basics - Anfänger-Themen 3
I BLOB / CLOB und Hibernate... Ratschläge benötigt Java Basics - Anfänger-Themen 10
B Regex Kombination benötigt Java Basics - Anfänger-Themen 5
I REST Api / JAX-RS, Swagger (OpenAPI) - generelle Starthilfen benötigt Java Basics - Anfänger-Themen 15
D Codeblöcke, die immer wieder im Programmverlauf benötigt werden Java Basics - Anfänger-Themen 5
Gaudimagspam Dringend Java Hilfe benötigt Java Basics - Anfänger-Themen 19
P Methode die eigentlich einen Scanner benötigt mit toString() Java Basics - Anfänger-Themen 5
L Kleine Hilfe beim Schreiben eines Programmes benötigt :D Java Basics - Anfänger-Themen 40
B Denkanstoß benötigt: Emails an bestimmte Emailadresse schicken Java Basics - Anfänger-Themen 6
S Schnelle Hilfe bei 2 kurzen Aufgaben benötigt Java Basics - Anfänger-Themen 2
M Klassen Klassendiagramm - Hilfe benötigt Java Basics - Anfänger-Themen 0
N Zeit berechnen, die für eine Strecke benötigt wird Java Basics - Anfänger-Themen 3
I Programmierung-Hausaufgabe: Hilfe benötigt Java Basics - Anfänger-Themen 8
B Kleine Erklärung zu einer Codezeile benötigt Java Basics - Anfänger-Themen 5
R Codeerklärung benötigt Java Basics - Anfänger-Themen 12
S Bisschen hilfe beim Sudoku Lösen benötigt Java Basics - Anfänger-Themen 7
J fileReader: wird dateipfad benötigt? Java Basics - Anfänger-Themen 8
M Denkanstoß für Umlaufzahl dringend benötigt! Java Basics - Anfänger-Themen 9
A for Zähl schleife hilfe benötigt Java Basics - Anfänger-Themen 12
J Anfänger Beispiele benötigt Java Basics - Anfänger-Themen 3
X Mit JSPs anfangen ... Was wird benötigt? Java Basics - Anfänger-Themen 5
C Hilfe bei Schleifen und Basics benötigt Java Basics - Anfänger-Themen 2
M Containerfile benötigt - aber wie? Java Basics - Anfänger-Themen 11
F Hilfe benötigt Java Basics - Anfänger-Themen 7
S 2 regex-Funktionen benötigt Java Basics - Anfänger-Themen 4
M Mails zum Server senden der Authentisierung benötigt Java Basics - Anfänger-Themen 3
D threadfehler: stischer zusamenhang benötigt. Java Basics - Anfänger-Themen 2
F ByteBuffer Fehler bei den letzten 2 Bytes Java Basics - Anfänger-Themen 1
F [Erledigt] ByteBuffer Java Basics - Anfänger-Themen 2
I Methoden ByteBuffer - Anzahl führender Nullen Java Basics - Anfänger-Themen 3
Helgon ByteBuffer is not direct Java Basics - Anfänger-Themen 5
I Umgang mit ByteBuffer Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben