2016-05-25 9 views
7

Ich habe eine Zeichenfolge und ich muss es als Char-Array durchlaufen. Natürlich ist die normale Methode toCharArray()Wie kann ich eine Zeichenfolge in char [] konvertieren, ohne das Objekt zu kopieren?

String str = "Hello"; 
char[] charArr = str.toCharArray(); 

Jetzt zu verwenden, der Quellcode für ToCharArray() ist wie folgt.

public char[] toCharArray() { 
    // Cannot use Arrays.copyOf because of class initialization order issues 
    char result[] = new char[value.length]; 
    System.arraycopy(value, 0, result, 0, value.length); 
    return result; 
} 

So Java ist ein neues Objekt im Speicher vom Typ char Erstellen von [] und dem Kopieren des String-Objekts auf das neue Objekt.

Meine Frage ist, ob es möglich ist, eine Zeichenfolge als char [] zu verwenden, ohne das Array zu kopieren. Meine Absicht ist es, Speicherplatz zu sparen. Wenn das nicht möglich ist, gibt es einen Grund dafür?

Vielen Dank im Voraus!

+4

Eine direkte Referenz auf ein veränderbares 'char []' -Array eines Objekts, das unveränderlich sein soll, übergeben, wäre eine sehr schlechte Idee, besonders wenn das betreffende unveränderliche Objekt vom Typ 'String' ist um sicherheitsrelevante Rollen zu erfüllen. – Holger

+2

Wenn Sie Speicherplatz sparen möchten, fragen Sie nicht nach dem Array char [] '. Du hast nicht erklärt, warum du denkst, dass du es brauchst. – Holger

+0

Ich brauche ein Array, damit ich es per Index durchlaufen kann. Was ich jedoch nicht bemerkt habe und worauf Nicolas Filotto hingewiesen hat, ist, dass Strings einfach eine Klasse sind, die den String in einem 'char []' Array speichert. Doy! Anfänger Fehler :) –

Antwort

11

Nein, es ist nicht. Nicht ohne Reflexion, die Sie vermeiden sollten. Das Mischen mit dem zugrunde liegenden char[] in einer Zeichenfolge über Reflexion ist ein Rezept für subtile Bugs. Sie können auf einzelne Zeichen in einer Zeichenfolge mit charAt zugreifen, aber wenn Sie wirklich eine char[] benötigen, sollten Sie einfach toCharArray aufrufen.

Wenn das nicht möglich ist, gibt es einen Grund, so?

Erster Grund: Verkapselung. Das Array ist ein privates Implementierungsdetail.

Zweiter Grund: Unveränderlichkeit. Strings sind unveränderlich, aber Arrays nie sind. Sie könnten also das zugrundeliegende char-Array modifizieren, und die Zeichenkette würde mutiert werden, was zur Überraschung aller Entwickler wäre, die sich auf die normale Unveränderlichkeit verlassen.

+1

Und außerdem würden andere Verweise auf die gleiche Zeichenfolge im String-Pool auch die gleiche mutierte Zeichenfolge haben, was zu größerer Verwirrung führt. – Pokechu22

+1

@ Pokechu22: Schlimmer noch, Sicherheitsrichtlinien (Berechtigungen, Codequellen, Benutzernamen) werden als Strings gespeichert, so dass das Ändern des gesamten Sicherheitsmodells unterlaufen würde. – Holger

3

Hier ist, wie Sie eine String irgendwie als char Array durchqueren können toCharArray() ohne Verwendung:

for (int i = 0; i < str.length(); i++) { 
    char c = str.charAt(i); 
} 
+1

Nun nicht das "es", dass das OP über ... fragte, wenn das OP nur eine Methode hat, die ein 'char []' akzeptiert, das sie nicht ändern können, zum Beispiel, wird dies nicht gehen Hilfe überhaupt. –

+0

Und wo speichern Sie diese generierten Char's? –

+1

"Ich habe eine Zeichenfolge und ich muss es als Char-Array durchlaufen" Dies ist die Hauptanforderung des OP, was ich vorschlagen Hilfe beim Durchlaufen der Zeichenfolge, wenn es nicht, was das OP erwartet er muss die Frage –

3

Da Sie das Array zurück erwarten, gibt es keine Möglichkeit, ein Array zu erhalten, ohne ein neues Array zu erstellen.

Dies ist der sauberste Weg. Obwohl Sie Ihre eigene Funktion erstellen und einen Trick machen, werden Sie am Ende ein neues Array erstellen.

Gehen Sie mit Ihren aktuellen Codes.