Wie bekomme ich ein Sub-Array Array in Java, ohne Daten zu kopieren?
Habe ich einige Bibliothek von Klassen, die Zusammenarbeit mit meinen Daten, die gelesen wird, in den buffer. Ist es irgendwie möglich, vermeiden Sie das kopieren von arrays wieder und wieder, vorbei an Teile der Daten tiefer und tiefer in die Methoden der Verarbeitung? Gut, es klingt seltsam, aber in meinem speziellen Fall, es ist ein besonderer Schriftsteller, der teilt die Daten in Blöcke und schreibt Sie einzeln in verschiedenen Orten, so dass es gerade führt-System.arraycopy, bekommt, was er braucht und fordert zugrunde liegenden Autorin mit, dass die neue sub array. Und das passiert viele Male. Was ist der beste Ansatz zum Refactoring von code?
InformationsquelleAutor der Frage Illarion Kovalchuk | 2010-08-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Viele Klassen in Java akzeptiert eine Teilmenge eines arrays als parameter. E. g. Schriftsteller.write(char cbuf[], int off, int len). Vielleicht ist dies schon reicht für deinen Anwendungsfall.
InformationsquelleAutor der Antwort Markus Kull
Diese Methode nicht, geben Sie ein array, sondern eine
List
, das ist viel flexibler.InformationsquelleAutor der Antwort Ricky Clarkson
Gibt es keinen wirklichen Weg, um wrap-Daten ohne kopieren und Immobilien, array in Java. Man kann nur neue erstellen array über vorhandene Speicher. Sie haben grundsätzlich 2 Möglichkeiten:
Können Sie verwenden
java.nio.Buffer
Klassen-Hierarchie, vor allemjava.nio.ByteBuffer
bietet Puffer Abstraktion auf ganze Arrays oder sub-ranges. Oft ist es was die Menschen brauchen. Dieser bietet auch viele interessante Fähigkeiten, wie 'zero-copy' flip und flexible byte-Bereichs-Darstellung.Hier ist zum Beispiel das einwickeln mit
java.nio.ByteBuffer
.Dieser sollte sehr nahe an dem, was Sie brauchen. Zumindest für einige Operationen.
Dann können Sie auf
buf
alleByteBuffer
Betrieb.Nur eine Warnung,
buf.array()
gibt originala1
array (backend), in dem alle Elemente.InformationsquelleAutor der Antwort Roman Nikitchenko
Dort ist keine Weise, zu erklären ein subarray in Java, wenn Sie Verwendung in arrays wie byte[]. Der Grund ist: Die Länge des array wird mit den Daten gespeichert, die nicht mit der Deklaration der Referenz. Daher ein subarray, das keine Kopie der Daten hat keinen Ort, wo Sie speichern können, die Länge!
Also für die basic-Typen, die Sie verwenden können, die erwähnten effizienten byte-array kopiert und für die höheren Arten (Liste) gibt es Methoden zur Verfügung.
InformationsquelleAutor der Antwort Joachim
Könnten Sie nehmen den gleichen Ansatz, wie die
String
die Klasse; erstellen Sie eine Klasse für unveränderliche Objekte, die aufgebaut sind aus einem array ein start-offset und Versatz vor Ende " den Zugriff auf die sub-array. Der Benutzer eines solchen Objekts nicht den Unterschied kennen zwischen dem ganzen array oder ein sub-array. Der Konstruktor muss nicht kopieren, das array speichern nur die array-Referenz-und seine Grenzen.InformationsquelleAutor der Antwort rsp
Könnten Sie (ArrayList).Unterliste(Wert1, Wert2) ich denke, dass vielleicht helfen könnte in deinem Fall? Das ist natürlich, wenn Sie verwenden möchten eine ArrayList.
InformationsquelleAutor der Antwort Kotten
Haben Sie einen Blick auf
Arrays.copyOfRange(***)
Methoden.InformationsquelleAutor der Antwort Manuel Selva