Warum ist String in Java unveränderlich?

176

Ich wurde in einem Interview gefragt, warum String unveränderlich ist

Ich antwortete so:

Wenn wir einen String in Java wie String s1="hello";dann erstellen, wird ein Objekt im String-Pool erstellt (Hallo) und s1 zeigt auf Hallo . Wenn wir dies erneut tun, String s2="hello";wird kein anderes Objekt erstellt, aber s2 zeigt darauf, hello weil JVM zuerst prüft Wenn dasselbe Objekt im Zeichenfolgenpool vorhanden ist oder nicht. Wenn es nicht vorhanden ist, wird nur ein neues Objekt erstellt, andernfalls nicht.

Wenn nun angenommen wird, dass Java eine veränderbare Zeichenfolge zulässt , ist der Wert von s2 ebenfalls, wenn wir s1 in ändernhello worldhello world , so Java - String unveränderlich ist.

Kann mir bitte jemand sagen, ob meine Antwort richtig oder falsch ist ?

schaukeln
quelle
46
Warum ist immer schwer zu beantworten. Die richtigste Antwort lautet wahrscheinlich: Weil die Sprachdesigner es für eine gute Idee hielten.
Keppil
1
siehe auch diese Antwort
3
Ihre Antwort ist nicht auf den Punkt. C ++ std::stringist veränderlich, aber sie haben auch einen String-Pool (genauer gesagt, einen Zeichen-Array-Pool).
Siyuan Ren
1
@rocking Um ehrlich zu sein, hängt es davon ab, wie sie es lesen, ob es richtig ist oder nicht. Die Sache ist, Java kann einen String-Pool haben, weil Strings unveränderlich sind. Wenn sie beschlossen hätten, Strings veränderbar zu machen, hätten sie keinen String-Pool verwendet. Daher ist es möglicherweise nicht korrekt, "Zeichenfolgenpool, daher unveränderliche Zeichenfolgen" zu sagen. es ist eher umgekehrt. Das Gründe für die Wahl unveränderliche Strings werden im Folgenden beschrieben, und der String - Pool ist eine Arbeitsstrategie , weil davon. Trotzdem ist Ihre Antwort nicht falsch , sie scheint einfach nicht vollständig zu sein. Sie müssen nur abwarten, was sie sagen.
Jason C
34
Ich kann einfach nicht verstehen, warum diese Frage geschlossen wurde. Die angeblich verwandte Antwort bezieht sich nicht einmal auf Java und geht nicht auf das Hauptthema dieser Frage ein, nämlich das "Warum". Für mich ist dies einer der Fälle einer verantwortungslosen Gemeinschaft, die auf Fragen handelt, von denen sie nichts wissen. Ich habe es für die Wiedereröffnung nominiert.
Edwin Dalorzo

Antworten:

163

String ist aus mehreren Gründen unveränderlich, hier eine Zusammenfassung:

  • Sicherheit : Parameter werden normalerweise als dargestelltString in Netzwerkverbindungen, Datenbankverbindungs-URLs, Benutzernamen / Passwörtern usw. dargestellt. Wenn sie veränderbar wären, könnten diese Parameter leicht geändert werden.
  • Synchronisation und Parallelität: Wenn Sie String unveränderlich machen, werden sie automatisch threadsicher, wodurch die Synchronisationsprobleme gelöst werden.
  • Caching : Wenn der Compiler Ihre String-Objekte optimiert, sieht er, dass wenn zwei Objekte denselben Wert haben (a = "test" und b = "test") und Sie daher nur ein String-Objekt benötigen (für a und b werden diese beiden Objekte) auf dasselbe Objekt zeigen).
  • Laden von Klassen : StringWird als Argument für das Laden von Klassen verwendet. Wenn veränderlich, kann dies dazu führen, dass eine falsche Klasse geladen wird (da veränderbare Objekte ihren Status ändern).

Abgesehen davon Stringbedeutet Unveränderlichkeit von nur, dass Sie es nicht mit seiner öffentlichen API ändern können. Sie können die normale API mithilfe von Reflection umgehen. Siehe die Antwort hier .

Wenn in Ihrem Beispiel Stringveränderlich war, betrachten Sie das folgende Beispiel:

  String a="stack";
  System.out.println(a);//prints stack
  a.setValue("overflow");
  System.out.println(a);//if mutable it would print overflow
Gemeinschaft
quelle
14
Wie könnte es die Sicherheit beeinflussen?
Archit Maheshwari
2
Kann jemand das Laden von Klassen anhand eines Beispiels erklären, wenn dies möglich ist?
Viraj
6
Wenn ich aus Sicherheitsgründen an der Änderung von Verbindungsparametern interessiert bin, ist dies zur Laufzeit unkompliziert (mit einem Debugger usw.). Wenn das Laden von Klassen Stringveränderlich ist, nimmt der Klassenlader die übergebene Zeichenfolge, erstellt eine Kopie und ändert ihre Kopie nicht. Wenn Sie an ein Problem mit veränderlichen java.lang.Strings denken, denken Sie daran, wie C ++ dieses Problem löst (da es veränderbare std::strings hat.
Begrenzte Versöhnung
Wie kann in Bezug auf die Sicherheit eine veränderbare Zeichenfolge geändert werden, wenn das Programm ausgeführt wird?
MasterJoe2
Da String unveränderlich ist, wird sein Hashcode zum Zeitpunkt der Erstellung zwischengespeichert und muss nicht erneut berechnet werden.
Abdul Alim Shakir
45

Java-Entwickler entscheiden, dass Strings aufgrund des folgenden Aspekts Design, Effizienz und Sicherheit unveränderlich sind .

Design Strings werden in einem speziellen Speicherbereich im Java-Heap erstellt, der als "String Intern Pool" bezeichnet wird. Während Sie einen neuen String erstellen (nicht bei Verwendung des String () - Konstruktors oder anderer String-Funktionen, die intern den String () - Konstruktor zum Erstellen eines neuen String-Objekts verwenden; der String () - Konstruktor erstellt immer eine neue String-Konstante im Pool, es sei denn, wir Rufen Sie die Methode intern () auf Variable ) auf, die den Pool durchsucht, um zu überprüfen, ob sie bereits vorhanden ist. Wenn es vorhanden ist, geben Sie die Referenz des vorhandenen String-Objekts zurück. Wenn der String nicht unveränderlich ist, führt das Ändern des Strings mit einer Referenz zu einem falschen Wert für die anderen Referenzen.

Nach diesem Artikel auf DZone:

Sicherheit wird häufig als Parameter für viele Java-Klassen verwendet, z. B. Netzwerkverbindung, Öffnen von Dateien usw. Wenn die Zeichenfolge nicht unveränderlich ist, wird eine Verbindung oder Datei geändert und führt zu einer ernsthaften Sicherheitsbedrohung. Veränderbare Zeichenfolgen können auch in Reflection zu Sicherheitsproblemen führen, da die Parameter Zeichenfolgen sind.

Effizienz Der Hashcode der Zeichenfolge wird in Java häufig verwendet. Zum Beispiel in einer HashMap. Unveränderlich zu sein, garantiert, dass der Hashcode immer derselbe ist, so dass er zwischengespeichert werden kann, ohne sich um die Änderungen zu kümmern. Das bedeutet, dass der Hashcode nicht bei jeder Verwendung berechnet werden muss.

Alex Mathew
quelle
7
Ihr Verständnis des Zeichenfolgenpools ist falsch. String- Konstanten werden im internen Pool erstellt, aber es ist durchaus möglich, dass mehr als ein String-Objekt denselben Text enthält. Ich bin damit einverstanden, dass unveränderliche Strings das Pooling ermöglichen, aber es gibt nicht so viel Pooling, wie Sie angegeben haben.
Jon Skeet
@ JonSkeet Du hast recht. String s1 = neuer String ("Test"); Anweisung erstellt eine neue Zeichenfolgenkonstante im internen Pool, es sei denn, wir rufen die Methode intern () auf. Vielen Dank, dass Sie mein Wissen über den String Intern Pool vertieft haben.
Alex Mathew
2
Es ist mehr als nur die Verwendung des String-Konstruktors - fast alles, was einen neuen String erstellt, z. B. Teilzeichenfolge, Split, Concat usw., erstellt neue Strings. Konstanten zur Kompilierungszeit sind hier der Sonderfall, nicht die Norm ...
Jon Skeet
@ JonSkeet substring (), concat (), replace () usw. verwenden intern den String-Konstruktor zum Erstellen eines neuen String-Objekts. Vielen Dank für die Verbesserung meiner Antwort.
Alex Mathew
2
@ JonSkeet - Alle diese Antworten besagen, dass Unveränderlichkeit die "Sicherheit" verbessert, erklären aber nicht, wie. Sie alle verlinken auf einen vagen dzone-Artikel, der auch nicht hilft. Die Antworten / der Link erklären nicht, wie eine veränderbare Zeichenfolge geändert werden kann, wenn der Code ausgeführt wird. Könnten Sie bitte erklären ?
MasterJoe2
25

Wir können nicht sicher sein, was Java-Designer beim Entwerfen tatsächlich gedacht haben, Stringaber wir können diese Gründe nur aus den Vorteilen schließen, die wir aus der Unveränderlichkeit von Strings ziehen, von denen einige sind

1. Existenz eines String Constant Pools

Wie unter Warum String im String Constant Pool gespeichert wird beschrieben Artikel Zeichenfolgen im Artikel " , erstellt jede Anwendung zu viele Zeichenfolgenobjekte, um zu verhindern, dass JVM zuerst viele Zeichenfolgenobjekte erstellt und diese dann im Müll sammelt. JVM speichert alle String-Objekte in einem separaten Speicherbereich namens String-Konstantenpool und verwendet Objekte aus diesem zwischengespeicherten Pool erneut.

Immer wenn wir ein String-Literal erstellen, prüft JVM zuerst, ob dieses Literal bereits im konstanten Pool vorhanden ist oder nicht, und wenn es dort vorhanden ist, zeigt eine neue Referenz auf dasselbe Objekt in SCP.

String a = "Naresh";
String b = "Naresh";
String c = "Naresh";

In obigem Beispiel String - Objekt mit Wert Nareshwird nur einmal im SCP erstellt erhalten und alle Referenz a, b, cwird auf das gleiche Objekt zeigen , aber was ist, wenn wir in machen ändern versuchen azB a.replace("a", "").

Idealerweise asollte Wert Nreshaber b, csollte da als Endverbraucher unverändert bleiben wir die Veränderung in machen anur. Und wir wissen a, b, calle weisen das gleiche Objekt so , wenn wir eine Änderung vornehmen a, andere auch die Änderung widerspiegeln.

Die Unveränderlichkeit von Zeichenfolgen bewahrt uns jedoch vor diesem Szenario und wird sich aufgrund der Unveränderlichkeit des Zeichenfolgenobjekts Nareshniemals ändern. Wenn wir also Änderungen aanstelle von Änderungen am Zeichenfolgenobjekt vornehmen, Naresherstellt JVM ein neues Objekt, weist es zu aund nimmt dann Änderungen an diesem Objekt vor.

Ein String-Pool ist also nur aufgrund der Unveränderlichkeit von String möglich. Wenn String nicht unveränderlich gewesen wäre, hätte das Zwischenspeichern und Wiederverwenden von String-Objekten keine Möglichkeit, da Variablen den Wert geändert und andere beschädigt hätten.

Und deshalb wird es von JVM ganz speziell gehandhabt und hat einen speziellen Speicherbereich erhalten.

2. Gewindesicherheit

Ein Objekt wird als threadsicher bezeichnet, wenn mehrere Threads darauf ausgeführt werden, aber keiner von ihnen kann seinen Status beschädigen, und das Objekt hat zu jedem Zeitpunkt für jeden Thread denselben Status.

Da wir ein unveränderliches Objekt nach seiner Erstellung von niemandem ändern können, ist jedes unveränderliche Objekt standardmäßig threadsicher. Wir müssen keine Thread-Sicherheitsmaßnahmen anwenden, wie z. B. das Erstellen synchronisierter Methoden.

Aufgrund seiner unveränderlichen Natur kann das String-Objekt von mehreren Threads gemeinsam genutzt werden, und selbst wenn es von vielen Threads manipuliert wird, ändert es seinen Wert nicht.

3. Sicherheit

In jeder Anwendung müssen wir mehrere Geheimnisse übergeben, z. B. Benutzername \ Kennwörter des Benutzers, Verbindungs-URLs, und im Allgemeinen werden alle diese Informationen als Zeichenfolgenobjekt übergeben.

Angenommen, String wäre nicht unveränderlich gewesen, würde dies eine ernsthafte Sicherheitsbedrohung für die Anwendung darstellen, da diese Werte geändert werden dürfen. Wenn dies zulässig ist, werden diese möglicherweise aufgrund von falsch geschriebenem Code oder einer anderen Person geändert haben Zugriff auf unsere variablen Referenzen.

4. Laden der Klasse

Wie unter Erstellen von Objekten durch Reflektion in Java mit Beispiel erläutert , können wir verwendenClass.forName("class_name") Methode eine Klasse in den Speicher laden, die wiederum andere Methoden dazu aufruft. Und selbst JVM verwendet diese Methoden, um Klassen zu laden.

Wenn Sie jedoch klar sehen, dass alle diese Methoden den Klassennamen als Zeichenfolgenobjekt akzeptieren, werden beim Laden von Java-Klassen Zeichenfolgen verwendet, und die Unveränderlichkeit bietet Sicherheit, von der die richtige Klasse geladen wird ClassLoader.

Angenommen, String wäre nicht unveränderlich gewesen und wir versuchen zu laden, java.lang.Objectwelche org.theft.OurObjectdazwischen geändert werden, und jetzt haben alle unsere Objekte ein Verhalten, das jemand für unerwünschte Dinge verwenden kann.

5. HashCode-Caching

Wenn wir Hashing-bezogene Operationen an einem Objekt ausführen hashCode()möchten, müssen wir die Methode überschreiben und versuchen, unter Verwendung des Status des Objekts einen genauen Hashcode zu generieren. Wenn sich der Status eines Objekts ändert, sollte sich auch sein Hashcode ändern.

Da String unveränderlich ist, wird der Wert, den ein String-Objekt enthält, niemals geändert, was bedeutet, dass sich auch sein Hashcode nicht ändert, was der String-Klasse die Möglichkeit gibt, ihren Hashcode während der Objekterstellung zwischenzuspeichern.

Ja, das String-Objekt speichert seinen Hashcode zum Zeitpunkt der Objekterstellung im Cache, was es zum idealen Kandidaten für Hashing-bezogene Operationen macht, da der Hashcode nicht erneut berechnet werden muss, was uns Zeit spart. Aus diesem Grund wird String hauptsächlich als HashMapSchlüssel verwendet.

Lesen Sie mehr darüber, warum String in Java unveränderlich und endgültig ist .

Naresh Joshi
quelle
1
In Bezug auf Sicherheit - Wie kann der Wert der veränderlichen Zeichenfolge im Speicher geändert werden? Wie kann eine andere Person Zugriff auf unsere Variablenreferenzen erhalten?
MasterJoe2
Es geht nicht darum, wie man Zugang zu den Referenzen bekommen kann, es ist was, wenn jemand Zugang zu diesen hat? wie erwähnt "Wenn String nicht unveränderlich gewesen wäre, würde dies eine ernsthafte Sicherheitsbedrohung für die Anwendung darstellen, da diese Werte geändert werden dürfen. Wenn dies zulässig ist, werden diese möglicherweise aufgrund von falsch geschriebenem Code oder einer anderen Person geändert." die Zugriff auf unsere variablen Referenzen haben. "
Naresh Joshi
Das Wie ist hier wichtig. Es ist entweder möglich, auf die Referenzen zuzugreifen oder nicht. Wenn möglich, können Sie dann 1-2 Techniken *** (dh das Wie) nennen, die dazu verwendet werden können? Wenn dies nicht möglich ist, gilt der Punkt zur Sicherheit nicht. *** Beispiel - Nennen Sie eine Technik, um die Datenbank einer Webanwendung anzugreifen -> SQL Injection. Kennen Sie solche Techniken, um die Referenzen anzugreifen?
MasterJoe2
Wie bereits erwähnt, "kann dies auf falsch geschriebenen Code oder auf Änderungen zurückzuführen sein, die von einer anderen Person vorgenommen wurden, die Zugriff auf unsere variablen Referenzen hat." Angenommen, String ist veränderlich und Sie schreiben eine Methode, die einen String als String-Geheimnis verwendet. Wiederum wird dieser String an mehrere andere Methoden dazwischen übergeben, und eine dieser Methoden wird von Ihnen nicht geschrieben, und diese Methode hat einige Änderungen daran vorgenommen Zeichenfolge Nachdem Sie alle diese Methoden aufgerufen haben, hat das Steuerelement Ihre Methode zurückgegeben und Sie verwenden diese Zeichenfolge erneut, sie wurde jedoch geändert.
Naresh Joshi
2
Bitte legen Sie jegliche Zugehörigkeit offen und verwenden Sie die Website nicht, um Ihre Website durch Veröffentlichung zu bewerben. Siehe Wie schreibe ich eine gute Antwort? .
Yvette
21

Wichtigster Grund laut diesem Artikel auf DZone:

String Constant Pool ... Wenn der String veränderbar ist, führt das Ändern des Strings mit einer Referenz zu einem falschen Wert für die anderen Referenzen.

Sicherheit

String wird häufig als Parameter für viele Java-Klassen verwendet, z. B. Netzwerkverbindung, Öffnen von Dateien usw. Wenn String nicht unveränderlich wäre, würde eine Verbindung oder Datei geändert und würde zu einer ernsthaften Sicherheitsbedrohung führen. ...

Hoffe es wird dir helfen.

JDGuide
quelle
@ JasonC Ich möchte nur wissen, ob meine Antwort falsch ist oder nicht. Ich hatte bereits an dem Interview teilgenommen und auf das Ergebnis gewartet. Wenn die Antwort ihnen sagt, dass sie richtig ist, werde ich ausgewählt
rockt am
1
Nach meinem Wissen ist Ihre Antwort richtig, aber unveränderlich bedeutet, dass die Referenz niemals den Zeigeort ändert. Alles Gute für Ihr Interview.
JDGuide
1
Wenn Sie Ihren Punkt 1 akzeptieren, sollten alle Objekte unveränderlich sein.
Nicomp
Hallo JDeveloper, ich habe Ihre Antwort bearbeitet, um die Quelle Ihrer Antwort richtig zuzuordnen. Denken Sie daran, immer Blockzitate für wörtliche Kopien von Inhalten zu verwenden. Vielen Dank!
NickL
Der DZone-Artikel enthält wichtige Fehler beim Betrieb des Strign-Pools. Es ist nur für Konstanten. Ergo ist die angegebene Begründung ungültig.
Marquis von Lorne
4

Ich habe diesen Beitrag gelesen, warum String in Java unveränderlich oder endgültig ist, und nehme an, dass Folgendes der wichtigste Grund sein kann:

String ist in Java unveränderlich, da String-Objekte im String-Pool zwischengespeichert werden . Da zwischengespeicherte String-Literale von mehreren Clients gemeinsam genutzt werden, besteht immer das Risiko, dass die Aktion eines Clients alle anderen Clients betrifft.

Tho
quelle
1

Du hast recht. Stringin Java verwendet das Konzept des String PoolLiteral. Wenn eine Zeichenfolge erstellt wird und die Zeichenfolge bereits im Pool vorhanden ist, wird die Referenz der vorhandenen Zeichenfolge zurückgegeben, anstatt ein neues Objekt zu erstellen und seine Referenz zurückzugeben. Wenn eine Zeichenfolge nicht unveränderlich ist, wird die Zeichenfolge mit einer Referenz geändert führen zu dem falschen Wert für die anderen Referenzen.

Ich würde noch etwas hinzufügen, da Stringes unveränderlich ist, für Multithreading sicher ist und eine einzelne String-Instanz von verschiedenen Threads gemeinsam genutzt werden kann. Dadurch wird die Verwendung der Synchronisation für die Thread-Sicherheit vermieden thread safe. Strings sind implizit .

Akshay
quelle
0

String-Klasse FINALbedeutet, dass Sie keine Klasse erstellen können, um sie zu erben, die Grundstruktur zu ändern und den Sting veränderbar zu machen.

Eine andere Instanzvariable und Methoden der String-Klasse, die bereitgestellt werden, sind so, dass Sie das Stringeinmal erstellte Objekt nicht mehr ändern können .

Der Grund, den Sie hinzugefügt haben, macht den String überhaupt nicht unveränderlich. Dies alles sagt aus, wie der String im Heap gespeichert ist. Auch der String-Pool macht den großen Unterschied in der Leistung

Trete
quelle
11
Wenn die Klasse als endgültig deklariert wird, bedeutet dies, dass die Klasse nicht vererbt werden kann, aber nicht, dass die Instanzfelder der Klasse nicht geändert werden können und die Klasse daher unveränderlich ist.
Dmitry Bychenko
@Zeeshan: Die Beispielklassen, die Sie geben, sind alle unveränderlich.
Siyuan Ren
0

String wird von Sun-Mikrosystemen als unveränderlich angegeben, da String als Schlüssel für die Kartensammlung gespeichert werden kann. StringBuffer ist veränderbar. Aus diesem Grund kann es nicht als Schlüssel im Kartenobjekt verwendet werden

chaithanya krishna gogineni
quelle
0

Der wichtigste Grund dafür, dass ein String in Java unveränderlich gemacht wird, ist die Sicherheitsüberlegung . Als nächstes wäre Caching .

Ich glaube, andere Gründe, wie Effizienz, Parallelität, Design und String-Pool, ergeben sich aus der Tatsache, dass String unveränderlich gemacht wurde. Zum Beispiel. Der String-Pool konnte erstellt werden, da der String unveränderlich war und nicht umgekehrt.

Überprüfen Sie das Transkript des Gosling-Interviews hier

Aus strategischer Sicht sind sie in der Regel häufiger störungsfrei. Und es gibt normalerweise Dinge, die Sie mit unveränderlichen Dingen tun können, die Sie mit veränderlichen Dingen nicht tun können, wie das Zwischenspeichern des Ergebnisses. Wenn Sie eine Zeichenfolge an eine Dateiöffnungsmethode übergeben oder eine Zeichenfolge an einen Konstruktor für eine Beschriftung in einer Benutzeroberfläche übergeben, übergeben Sie in einigen APIs (wie in vielen Windows-APIs) ein Array von Zeichen. Der Empfänger dieses Objekts muss es wirklich kopieren, da er nichts über die Speicherlebensdauer weiß. Und sie wissen nicht, was mit dem Objekt passiert, ob es unter ihren Füßen verändert wird.

Sie werden fast gezwungen, das Objekt zu replizieren, weil Sie nicht wissen, ob Sie es besitzen oder nicht. Und eines der schönen Dinge an unveränderlichen Objekten ist, dass die Antwort lautet: "Ja, natürlich tust du das." Weil die Frage des Eigentums, wer das Recht hat, es zu ändern, nicht existiert.

Eines der Dinge, die Strings dazu zwangen, unveränderlich zu sein, war die Sicherheit. Sie haben eine Methode zum Öffnen von Dateien. Sie übergeben ihm einen String. Und dann werden alle Arten von Authentifizierungsprüfungen durchgeführt, bevor der Betriebssystemaufruf ausgeführt wird. Wenn Sie es schaffen, nach der Sicherheitsüberprüfung und vor dem Aufruf des Betriebssystems etwas zu tun, das den String effektiv mutiert, dann sind Sie dabei. Aber Strings sind unveränderlich, sodass diese Art von Angriff nicht funktioniert. Dieses genaue Beispiel hat wirklich verlangt, dass Strings unveränderlich sind

Sameer Sinha
quelle
0

Zusätzlich zu den großartigen Antworten wollte ich einige Punkte hinzufügen. Wie Strings, Array enthält einen Verweis auf den Start des Arrays so , wenn Sie zwei Arrays arr1und arr2und hat so etwas wie arr2 = arr1dies die Referenz machen arr2gleiche wie arr1damit Wert zu verändern in einem von ihnen in Veränderung des anderen zum Beispiel führt

public class Main {
    public static void main(String[] args) {
        int[] a = {1, 2, 3, 4};
        int[] b = a;
        a[0] = 8;
        b[1] = 7;
        System.out.println("A: " + a[0] + ", B: " + b[0]);
        System.out.println("A: " + a[1] + ", B: " + b[1]);
        //outputs
        //A: 8, B: 8
        //A: 7, B: 7
    }
}

Es würde nicht nur Fehler im Code verursachen, sondern kann (und wird) auch von böswilligen Benutzern ausgenutzt werden. Angenommen, Sie haben ein System, das das Administratorkennwort ändert. Der Benutzer muss zuerst das eingeben newPasswordund dann das, oldPasswordwenn das oldPasswordmit adminPassdem Programm identisch ist , das Kennwort um ändern adminPass = newPassword. Angenommen, das neue Kennwort hat dieselbe Referenz wie das Administratorkennwort, sodass ein fehlerhafter Programmierer möglicherweise eine tempVariable erstellt, die das Administratorkennwort enthält, bevor der Benutzer Daten eingibt, wenn das oldPasswordgleiche tempKennwort das Kennwort andernfalls ändertadminPass = temp. Jemand, der weiß, dass er leicht das neue Passwort eingeben kann und niemals das alte Passwort und Abrakadabra eingibt, hat Administratorzugriff. Eine andere Sache, die ich beim Erlernen von Strings nicht verstanden habe, warum erstellt JVM nicht für jedes Objekt einen neuen String und hat einen eindeutigen Speicherplatz dafür, und Sie können dies einfach mit tun. new String("str");Der Grund, den Sie nicht immer verwenden möchten, newist weil es nicht speichereffizient ist und in den meisten Fällen langsamer ist, lesen Sie mehr .

Qeaxe
quelle
0

Wenn HELLOIhr String ist , dann können Sie nicht ändern HELLOzu HILLO. Diese Eigenschaft wird als Unveränderlichkeitseigenschaft bezeichnet.

Sie können mehrere Zeiger-String-Variablen verwenden, um auf HELLO String zu zeigen.

Wenn HELLO char char ist, können Sie HELLO in HILLO ändern. Z.B,

char[] charArr = 'HELLO';
char[1] = 'I'; //you can do this

Antworten:

Programmiersprachen haben unveränderliche Datenvariablen, so dass sie als Schlüssel im Schlüssel-Wert-Paar verwendet werden können. String-Variablen werden als Schlüssel / Indizes verwendet und sind daher unveränderlich .

Uddhav Gautam
quelle
-1

Aus der SecuritySicht können wir dieses praktische Beispiel verwenden:

DBCursor makeConnection(String IP,String PORT,String USER,String PASS,String TABLE) {

    // if strings were mutable IP,PORT,USER,PASS can be changed by validate function
    Boolean validated = validate(IP,PORT,USER,PASS);

    // here we are not sure if IP, PORT, USER, PASS changed or not ??
    if (validated) {
         DBConnection conn = doConnection(IP,PORT,USER,PASS);
    }

    // rest of the code goes here ....
}
Darxtrix
quelle