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:

Hvordan strenge er arrangeret hukommelse

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 strvariablen gemmer en reference til et Stringobjekt.


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:

Tildeling af referencer til en streng

Efter denne type tildelingsoperation Stringforbliver 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 Stringobjekter, og variablerne textog messagevil 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:

Arbejde med referencer og objekter

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 Scannerobjekt (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 Scannerklassen fungerer her .

Sådan bliver det hele gemt i hukommelsen:

Arbejde med referencer og objekter.  Scanner klasse

I dette tilfælde forbliver et enkelt Stringobjekt i hukommelsen, som det var - kun referencer til det sendes rundt og gemmes i variabler.


5. Sammenligning af referencer til Stringobjekter

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:

Sammenligning af referencer til String-objekter

Variablerne messageog textrefererer til (gemmer adressen på) det samme objekt. Men variablerne s1og s2gemmer 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
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