1. Összehasonlítások

A programozóknak folyamatosan össze kell hasonlítaniuk a különböző változókat egymással. De, mint már láttad, nem minden olyan egyszerű.

Az egész számokat nagyon könnyű összehasonlítani – csak használja, ==és kész. A valós számok összehasonlításához össze kell hasonlítania a különbségüket (vagy inkább a különbség abszolút értékét) egy nagyon kis számmal.

A húrok összehasonlítása még nehezebb. Ez mindenekelőtt azért van, mert a karakterláncok objektumok. Sőt, a programozók gyakran azt szeretnék, ha a karakterlánc-összehasonlítás a helyzettől függően egy kicsit másképp menne.


2. Hogyan vannak elrendezve a karakterláncok a memóriában

Mint már láthatta, a karakterláncok a memóriában másképpen tárolódnak, mint az egészek és a valós számok:

Hogyan rendeződnek a karakterláncok a memóriában

A karakterláncok tárolására két memóriablokk szolgál: az egyik blokk magát a szöveget tárolja (mérete a szöveg méretétől függ), míg a második blokk (4 bájt) az első blokk címét tárolja.

Bár egy tapasztalt programozó olyasmit mondana, hogy "a String strváltozó egy objektumra való hivatkozást tárol String.


3. Hivatkozások hozzárendelése egy karakterlánchoz

Ennek a megközelítésnek az előnyei akkor válnak nyilvánvalóvá, ha egy karakterlánc-változót kell hozzárendelnie egy másik karakterlánc-változóhoz. Példa:

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

És íme, mit fog tartalmazni a memória ennek eredményeként:

Hivatkozások hozzárendelése egy karakterlánchoz

Az ilyen típusú hozzárendelési művelet után az Stringobjektum ott marad, ahol volt, és csak a címe (hivatkozás az objektumra) másolódik be a messageváltozóba.


4. Munka hivatkozásokkal és objektumokkal

De ha úgy dönt, hogy egy karakterláncot nagybetűvé (nagybetűvé) alakít át, a Java gép mindent jól csinál: végül két Stringobjektum lesz, és a textés messageváltozók hivatkozásokat tárolnak, mindegyik a saját objektumára.

Példa:

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

És íme, mit fog tartalmazni a memória ennek eredményeként:

Munka referenciákkal és objektumokkal

Kérjük, vegye figyelembe, hogy a toUpperCase()metódus nem változtatja meg a meghívott karakterláncot. Ehelyett létrehoz egy új karakterláncot (új objektumot), és visszaadja a hivatkozást.

Mit szólnál egy még érdekesebb példához. Tegyük fel, hogy úgy dönt, hogy átad egy karakterláncot egy objektumnak Scanner(hogy az értékeket olvasson ki a karakterláncból).

Példa:

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

Itt tudhat meg többet az Scannerosztály működéséről .

Mindez így kerül tárolásra a memóriában:

Munka referenciákkal és objektumokkal.  Szkenner osztály

Ebben az esetben egyetlen Stringobjektum ugyanúgy marad a memóriában, mint volt – csak a rá való hivatkozások kerülnek átadásra és változókban tárolódnak.


String5. Objektumokra való hivatkozások összehasonlítása

És végül elérkeztünk a szórakoztató részhez: a húrok összehasonlításához.

Két operátor használható a karakterláncváltozók összehasonlítására: ==(egyenlő) és !=(nem egyenlő). Nem használhatja a "nagyobb, mint", "kisebb, mint" vagy "nagyobb vagy egyenlő" operátorokat – a fordító nem engedélyezi.

De van itt egy érdekes árnyalat: valójában mi is tárolódik a karakterlánc-változókban? Így van: címek (hivatkozások) objektumokra. És ezeket a címeket fogják összehasonlítani:

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

Íme, mi marad az emlékezetben:

Hivatkozások összehasonlítása String objektumokra

A messageés textváltozók ugyanarra az objektumra vonatkoznak (tárolják a címet). De a s1és s2változók olyan objektumokra való hivatkozásokat tárolnak, amelyek nagyon hasonlóak, de különböznek egymástól.

És ha összehasonlítja ezt a 4 változót a kódban, akkor a következő eredményt kapja:

Kód Konzol kimenet
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