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:
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
str
variabelen lagrer en referanse til et String
objekt.
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:
Etter denne typen tilordningsoperasjon String
forblir 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 String
objekter, og variablene text
og message
vil 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:
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 Scanner
objekt (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 Scanner
klassen fungerer her .
Slik vil alt bli lagret i minnet:
I dette tilfellet forblir et enkelt String
objekt i minnet akkurat som det var - bare referanser til det sendes rundt og lagres i variabler.
5. Sammenligne referanser til String
objekter
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:
Variablene message
og text
refererer til (lagre adressen til) det samme objektet. Men variablene s1
og s2
lagrer 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 |
---|---|
|
|
GO TO FULL VERSION