Java-Referenzen verweisen immer auf ein Objekt. Das Objekt hat eine Kopfzeile, die unter anderem den konkreten Typ identifiziert (so dass Casts mit fehlschlagen könnenClassCastException
). Bei Arrays enthält der Start des Objekts auch die Länge, die Daten folgen unmittelbar danach im Speicher (technisch gesehen kann eine Implementierung frei tun, was sie will, aber es wäre dumm, etwas anderes zu tun). Sie können also keine Referenz haben, die irgendwo in ein Array zeigt.
In C zeigen Zeiger überall und auf alles, und Sie können auf die Mitte eines Arrays zeigen. Sie können jedoch nicht sicher umwandeln oder herausfinden, wie lang das Array ist. In D enthält der Zeiger einen Versatz in den Speicherblock und die Länge (oder gleichwertig einen Zeiger auf das Ende, ich kann mich nicht erinnern, was die Implementierung tatsächlich tut). Dies ermöglicht es D, Arrays zu schneiden. In C ++ hätten Sie zwei Iteratoren, die auf den Anfang und das Ende zeigen, aber C ++ ist so etwas seltsam.
Zurück zu Java, nein, das kannst du nicht. Wie bereits erwähnt, ByteBuffer
können Sie mit NIO ein Array umbrechen und dann in Scheiben schneiden, erhalten jedoch eine umständliche Oberfläche. Sie können natürlich kopieren, was wahrscheinlich sehr viel schneller ist, als Sie denken würden. Sie können Ihre eigene String
ähnliche Abstraktion einführen , mit der Sie ein Array in Scheiben schneiden können (die aktuelle Sun-Implementierung von String
hat eine char[]
Referenz plus Startversatz und Länge, eine leistungsstärkere Implementierung hat nur die char[]
). byte[]
ist auf niedrigem Niveau, aber jede klassenbasierte Abstraktion, die Sie anwenden, wird die Syntax bis JDK7 (vielleicht) schrecklich durcheinander bringen.