Heim  >  Artikel  >  Java  >  Ist String in Java veränderbar? (ausführliche Beispiele)

Ist String in Java veränderbar? (ausführliche Beispiele)

不言
不言Original
2018-09-17 17:12:152246Durchsuche

Der Inhalt dieses Artikels befasst sich mit der Frage, ob String in Java veränderbar ist. (Ausführliche Erläuterung der Beispiele) hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird Ihnen hilfreich sein.

Wir alle wissen, dass die String-Klasse in Java unveränderlich ist. Werfen wir einen Blick auf den Quellcode der String-Klasse.

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    
    /** The value is used for character storage. */
    private final char value[];
    
    /** Cache the hash code for the string */
    private int hash; // Default to 0
    
    // ...
    
}

Es ist ersichtlich, dass die String-Klasse vom endgültigen Typ ist und String nicht vererbt werden kann. Sein Wert ist die Kapselung des Zeichenarrays, also char[]. Sein Wert ist als privates Finale definiert, was bedeutet, dass er von der Außenwelt nicht geändert werden kann, also unveränderlich ist.

Ist String wirklich „unveränderlich“?

Sehen Sie sich das Beispiel unten an.

String str = "Python";
System.out.println(str); // Python

str = "Java";
System.out.println(str); // Java

str = str.substring(1);
System.out.println(str); // ava

Sie fragen sich vielleicht: Ist str nicht von Python auf Java umgestiegen? Dann wird es durch die Teilstring-Methode zu ava?

Dies ist eigentlich ein Missverständnis unter Anfängern. Wenn wir uns die Struktur von String oben ansehen, können wir erkennen, dass Strings nur ein Verweis auf „Python“ sind. , wurde später zu „Java“, und die Teilzeichenfolge verwendet auch die Methode Arrays.copyOfRange, um das Zeichenarray erneut zu kopieren und eine neue Zeichenfolge zu erstellen.

Ist String in Java veränderbar? (ausführliche Beispiele)

Die Zeichenfolge hier ist also nicht variabel, sie ändert lediglich die Zeichenfolgenreferenz.

Informationen zu den Unterschieden zwischen Teilstrings in verschiedenen JDK-Versionen finden Sie in diesem Artikel „Hinweis: Unterschiede in den String-Teilstring-Methoden in jkd6, 7 und 8“. Sie können sich auch den jeweiligen Quellcode ansehen Version des Teilstrings.

Ist String wirklich „unveränderlich“?

Das obige Beispiel ist definitiv unveränderlich, aber das folgende ist peinlich.

String str = "Hello Python";
System.out.println(str); // Hello Python

Field field = String.class.getDeclaredField("value");
field.setAccessible(true);

char[] value = (char[])field.get(str);
value[6] = &#39;J&#39;;
value[7] = &#39;a&#39;;
value[8] = &#39;v&#39;;
value[9] = &#39;a&#39;;
value[10] = &#39;!&#39;;
value[11] = &#39;!&#39;;
System.out.println(str); // Hello Java!!

Durch Reflexion ändern wir den Wert des zugrunde liegenden Zeichenarrays und erkennen die „Unveränderlichkeit“ der Zeichenfolge. Dies ist eine raffinierte Operation und wird nicht empfohlen. Sie verstößt gegen die Anforderungen von Java an die String-Klasse Das Designprinzip kann einige Sicherheitsprobleme verursachen.

Das obige ist der detaillierte Inhalt vonIst String in Java veränderbar? (ausführliche Beispiele). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn