1. Sammenligninger
Programmører er nødt til at sammenligne forskellige variabler med hinanden hele tiden. Men som du allerede har set, er alt ikke så enkelt.
Heltal er meget nemme at sammenligne - du skal bare bruge, ==
og du er færdig. For at sammenligne reelle tal skal du sammenligne deres forskel (eller rettere sagt, den absolutte værdi af forskellen) med et meget lille tal.
Det er endnu sværere at sammenligne strenge . Frem for alt skyldes det, at strenge er objekter. Desuden ønsker programmører ofte, at strengsammenligningen skal forløbe lidt anderledes afhængigt af situationen.
2. Hvordan strenge er arrangeret hukommelse
Som du allerede har set, lagres strenge i hukommelsen anderledes end heltal og reelle tal:
To hukommelsesblokke bruges til at gemme strenge: en blok gemmer selve teksten (dens størrelse afhænger af tekstens størrelse), mens den anden blok (4 bytes) gemmer adressen på den første blok.
Selvom en erfaren programmør ville sige noget som " String
str
variablen gemmer en reference til et String
objekt.
3. Tildeling af referencer til en streng
Fordelene ved denne fremgangsmåde bliver tydelige, når du skal tildele en strengvariabel til en anden strengvariabel. Eksempel:
String text = "This is a very important message";
String message = text;
Og her er hvad hukommelsen vil indeholde som et resultat:
Efter denne type tildelingsoperation String
forbliver objektet, hvor det var, og kun dets adresse (en reference til objektet) kopieres ind i variablen message
.
4. Arbejde med referencer og objekter
Men hvis du beslutter dig for at konvertere en streng til store bogstaver (store bogstaver), gør Java-maskinen alt rigtigt: du ender med to String
objekter, og variablerne text
og message
vil gemme referencer, hver til sit eget objekt.
Eksempel:
String text = "This is a very important message";
String message = text.toUpperCase();
Og her er hvad hukommelsen vil indeholde som et resultat:
Bemærk venligst, at toUpperCase()
metoden ikke ændrer den streng, den kaldes på. I stedet opretter den en ny streng (nyt objekt) og returnerer en reference til den.
Hvad med et endnu mere interessant eksempel. Lad os sige, at du beslutter dig for at sende en streng til et Scanner
objekt (så den læser værdier 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 mere om, hvordan Scanner
klassen fungerer her .
Sådan bliver det hele gemt i hukommelsen:
I dette tilfælde forbliver et enkelt String
objekt i hukommelsen, som det var - kun referencer til det sendes rundt og gemmes i variabler.
5. Sammenligning af referencer til String
objekter
Og endelig er vi nået til den sjove del: sammenligning af strenge.
Der er to operatorer, du kan bruge til at sammenligne strengvariabler: ==
(lige) og !=
(ikke lig). Du kan ikke bruge operatorerne "større end", "mindre end" eller "større end eller lig med" - compileren tillader det ikke.
Men der er en interessant nuance her: hvad bliver der faktisk gemt i strengvariabler? Det er rigtigt: adresser (referencer) til objekter. Og det er disse adresser, der vil blive sammenlignet:
String text = "Hi";
String message = text;
String s1 = text.toUpperCase();
String s2 = text.toUpperCase();
Her er hvad der vil være i hukommelsen:
Variablerne message
og text
refererer til (gemmer adressen på) det samme objekt. Men variablerne s1
og s2
gemmer referencer til objekter, der er meget ens, men forskellige.
Og hvis du sammenligner disse 4 variabler i koden, får du følgende resultat:
Kode | Konsoludgang |
---|---|
|
|
GO TO FULL VERSION