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:
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
str
Variable speichert einen Verweis auf ein String
Objekt.“
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:
Nach dieser Art von Zuweisungsoperation String
bleibt das Objekt dort, wo es war, und nur seine Adresse (ein Verweis auf das Objekt) wird in die message
Variable 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 String
Objekte, und die text
Variablen message
und 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:
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();
Scanner
Mehr über die Funktionsweise des Kurses erfahren Sie hier .
So wird alles im Speicher abgelegt:
In diesem Fall bleibt ein einzelnes String
Objekt so im Speicher, wie es war – nur Verweise darauf werden weitergegeben und in Variablen gespeichert.
5. Vergleichen von Verweisen auf String
Objekte
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:
Die Variablen message
und text
verweisen auf dasselbe Objekt (speichern dessen Adresse). Aber die Variablen s1
und s2
speichern 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 |
---|---|
|
|
GO TO FULL VERSION