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:
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
str
vá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:

Az ilyen típusú hozzárendelési művelet után az String
objektum ott marad, ahol volt, és csak a címe (hivatkozás az objektumra) másolódik be a message
vá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 String
objektum lesz, és a text
és message
vá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:
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 Scanner
osztály működéséről .
Mindez így kerül tárolásra a memóriában:
Ebben az esetben egyetlen String
objektum 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.
String
5. 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:
A message
és text
változók ugyanarra az objektumra vonatkoznak (tárolják a címet). De a s1
és s2
vá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 |
---|---|
|
|
GO TO FULL VERSION