1. Vergleiche

Programmierer müssen ständig verschiedene Variablen miteinander vergleichen. Aber wie Sie bereits gesehen haben, ist nicht alles so einfach.

Ganzzahlen lassen sich sehr einfach vergleichen – einfach verwenden ==und fertig. Um reelle Zahlen zu vergleichen , müssen Sie ihre Differenz (oder besser gesagt den Absolutwert der Differenz) mit einer sehr kleinen Zahl vergleichen.

Der Vergleich von Saiten ist noch schwieriger. Das liegt vor allem daran, dass Strings Objekte sind. Darüber hinaus wünschen sich Programmierer oft, dass der String-Vergleich je nach Situation etwas anders verläuft.


2. Wie Strings im Speicher angeordnet sind

Wie Sie bereits gesehen haben, werden Zeichenfolgen anders im Speicher gespeichert als ganze Zahlen und reelle Zahlen:

Wie Strings im Gedächtnis angeordnet sind

Zum Speichern von Zeichenfolgen werden zwei Speicherblöcke verwendet: Ein Block speichert den Text selbst (seine Größe hängt von der Größe des Textes ab), während der zweite Block (4 Bytes) die Adresse des ersten Blocks speichert .

Obwohl ein erfahrener Programmierer so etwas sagen würde wie „Die String strVariable speichert einen Verweis auf ein StringObjekt.“


3. Zuweisen von Referenzen zu einer Zeichenfolge

Die Vorteile dieses Ansatzes werden deutlich, wenn Sie eine String-Variable einer anderen String-Variable zuweisen müssen. Beispiel:

String text = "This is a very important message";
String message = text;

Und hier ist, was der Speicher als Ergebnis enthalten wird:

Zuweisen von Referenzen zu einer Zeichenfolge

Nach dieser Art von Zuweisungsoperation Stringbleibt das Objekt dort, wo es war, und nur seine Adresse (ein Verweis auf das Objekt) wird in die messageVariable kopiert.


4. Arbeiten mit Referenzen und Objekten

Wenn Sie sich jedoch dafür entscheiden, einen String in Großbuchstaben (Großbuchstaben) umzuwandeln, macht die Java-Maschine alles richtig: Am Ende erhalten Sie zwei StringObjekte, und die textVariablen messageund speichern Referenzen, jedes auf sein eigenes Objekt.

Beispiel:

String text = "This is a very important message";
String message = text.toUpperCase(); 

Und hier ist, was der Speicher als Ergebnis enthalten wird:

Arbeiten mit Referenzen und Objekten

Bitte beachten Sie, dass die toUpperCase()Methode die Zeichenfolge, für die sie aufgerufen wird, nicht ändert . Stattdessen wird eine neue Zeichenfolge (neues Objekt) erstellt und eine Referenz darauf zurückgegeben.

Wie wäre es mit einem noch interessanteren Beispiel? Nehmen wir an, Sie beschließen, eine Zeichenfolge an ein Objekt zu übergeben Scanner(damit es Werte aus der Zeichenfolge liest).

Beispiel:

String text = "10 20 40 80";
Scanner console = new Scanner(text);
int a = console.nextInt();
int b = console.nextInt();

ScannerMehr über die Funktionsweise des Kurses erfahren Sie hier .

So wird alles im Speicher abgelegt:

Arbeiten mit Referenzen und Objekten.  Scannerklasse

In diesem Fall bleibt ein einzelnes StringObjekt so im Speicher, wie es war – nur Verweise darauf werden weitergegeben und in Variablen gespeichert.


5. Vergleichen von Verweisen auf StringObjekte

Und schließlich sind wir beim unterhaltsamen Teil angelangt: dem Saitenvergleich.

Es gibt zwei Operatoren, die Sie zum Vergleichen von String-Variablen verwenden können: ==(gleich) und !=(ungleich). Sie können die Operatoren „größer als“, „kleiner als“ oder „größer als oder gleich“ nicht verwenden – der Compiler lässt dies nicht zu.

Aber hier gibt es eine interessante Nuance: Was wird eigentlich in String-Variablen gespeichert? Das ist richtig: Adressen (Verweise) auf Objekte. Und es sind diese Adressen, die verglichen werden:

String text = "Hi";
String message = text;
String s1 = text.toUpperCase();
String s2 = text.toUpperCase(); 

Folgendes wird Ihnen in Erinnerung bleiben:

Vergleichen von Referenzen auf String-Objekte

Die Variablen messageund textverweisen auf dasselbe Objekt (speichern dessen Adresse). Aber die Variablen s1und s2speichern Verweise auf Objekte, die sehr ähnlich, aber unterschiedlich sind.

Und wenn man diese 4 Variablen im Code vergleicht, dann erhält man folgendes Ergebnis:

Code Konsolenausgabe
String text = "Hi";
String message = text;
String s1 = text.toUpperCase();
String s2 = text.toUpperCase();
System.out.println(text == message);
System.out.println(text == s1);
System.out.println(s1 == s2); 


true  // The addresses are equal
false // The addresses are different
false // The addresses are different