1. Sammenligninger

Programmerere må sammenligne forskjellige variabler med hverandre hele tiden. Men som du allerede har sett, er ikke alt så enkelt.

Heltall er veldig enkelt å sammenligne - du bare bruker ==og du er ferdig. For å sammenligne reelle tall , må du sammenligne deres forskjell (eller rettere sagt, den absolutte verdien av forskjellen) med et veldig lite tall.

Det er enda vanskeligere å sammenligne strenger . Fremfor alt er dette fordi strenger er objekter. Dessuten vil programmerere ofte at strengsammenligningen skal gå litt annerledes avhengig av situasjonen.


2. Hvordan strenger er ordnet minne

Som du allerede har sett, lagres strenger i minnet annerledes enn heltall og reelle tall:

Hvordan strenger er ordnet minne

To minneblokker brukes til å lagre strenger: en blokk lagrer selve teksten (størrelsen avhenger av størrelsen på teksten) mens den andre blokken (4 byte) lagrer adressen til den første blokken.

Selv om en erfaren programmerer ville si noe sånt som " String strvariabelen lagrer en referanse til et Stringobjekt.


3. Tilordne referanser til en streng

Fordelene med denne tilnærmingen blir tydelige når du må tilordne en strengvariabel til en annen strengvariabel. Eksempel:

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

Og her er hva minnet vil inneholde som et resultat:

Tilordne referanser til en streng

Etter denne typen tilordningsoperasjon Stringforblir objektet der det var, og bare adressen (en referanse til objektet) kopieres inn i variabelen message.


4. Arbeide med referanser og objekter

Men hvis du bestemmer deg for å konvertere en streng til store bokstaver (store bokstaver), gjør Java-maskinen alt riktig: du vil ende opp med to Stringobjekter, og variablene textog messagevil lagre referanser, hver til sitt eget objekt.

Eksempel:

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

Og her er hva minnet vil inneholde som et resultat:

Arbeide med referanser og objekter

Vær oppmerksom på at toUpperCase()metoden ikke endrer strengen den kalles på. I stedet oppretter den en ny streng (nytt objekt) og returnerer en referanse til den.

Hva med et enda mer interessant eksempel. La oss si at du bestemmer deg for å sende en streng til et Scannerobjekt (slik at den leser verdier fra strengen).

Eksempel:

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

Du kan lære mer om hvordan Scannerklassen fungerer her .

Slik vil alt bli lagret i minnet:

Arbeide med referanser og objekter.  Skanner klasse

I dette tilfellet forblir et enkelt Stringobjekt i minnet akkurat som det var - bare referanser til det sendes rundt og lagres i variabler.


5. Sammenligne referanser til Stringobjekter

Og til slutt har vi nådd den morsomme delen: sammenligning av strenger.

Det er to operatorer du kan bruke til å sammenligne strengvariabler: ==(lik) og !=(ikke lik). Du kan ikke bruke operatorene "større enn", "mindre enn" eller "større enn eller lik" - kompilatoren vil ikke tillate det.

Men det er en interessant nyanse her: hva blir faktisk lagret i strengvariabler? Det stemmer: adresser (referanser) til objekter. Og det er disse adressene som skal sammenlignes:

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

Her er hva som vil være i minnet:

Sammenligning av referanser til String-objekter

Variablene messageog textrefererer til (lagre adressen til) det samme objektet. Men variablene s1og s2lagrer referanser til objekter som er veldig like, men forskjellige.

Og hvis du sammenligner disse 4 variablene i koden, får du følgende resultat:

Kode Konsollutgang
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