1. Karşılaştırmalar
Programcıların her zaman farklı değişkenleri birbiriyle karşılaştırması gerekir. Ancak, daha önce de gördüğünüz gibi, her şey o kadar basit değil.
Tamsayıları karşılaştırmak çok kolaydır — sadece kullanırsınız ==ve işiniz biter. Gerçek sayıları karşılaştırmak için , aralarındaki farkı (veya daha doğrusu farkın mutlak değerini) çok küçük bir sayı ile karşılaştırmanız gerekir.
Dizeleri karşılaştırmak daha da zordur. Her şeyden önce bunun nedeni, dizelerin nesneler olmasıdır. Dahası, programcılar genellikle dize karşılaştırmasının duruma bağlı olarak biraz farklı olmasını isterler.
2. Dizeler hafızada nasıl düzenlenir?
Daha önce gördüğünüz gibi, diziler bellekte tam sayılardan ve gerçek sayılardan farklı şekilde depolanır:

Dizeleri depolamak için iki bellek bloğu kullanılır: bir blok metnin kendisini saklarken (boyutu metnin boyutuna bağlıdır), ikinci blok (4 bayt) birinci bloğun adresini saklar.
Deneyimli bir programcı " String strdeğişken bir nesneye referans depolar String.
3. Bir dizgeye referans atama
Bu yaklaşımın faydaları, bir dizi değişkenini başka bir dizi değişkenine atamanız gerektiğinde belirginleşir. Örnek:
String text = "This is a very important message";
String message = text;
Ve sonuç olarak belleğin içereceği şey şu:
Bu tür bir atama işleminden sonra, Stringnesne olduğu yerde kalır ve yalnızca adresi (nesneye bir referans) değişkene kopyalanır message.
4. Referanslar ve nesnelerle çalışma
Ancak bir dizeyi büyük harfe (büyük harfler) dönüştürmeye karar verirseniz, Java makinesi her şeyi doğru yapar: sonunda iki Stringnesne elde edersiniz ve textve messagedeğişkenleri, her biri kendi nesnesine referanslar depolar.
Örnek:
String text = "This is a very important message";
String message = text.toUpperCase();
Ve sonuç olarak belleğin içereceği şey şu:

toUpperCase()Lütfen yöntemin çağrıldığı dizeyi değiştirmediğini unutmayın . Bunun yerine, yeni bir dize (yeni nesne) oluşturur ve ona bir başvuru döndürür.
Daha da ilginç bir örneğe ne dersiniz? Diyelim ki bir Scannernesneye bir dizge iletmeye karar verdiniz (böylece nesne dizgeden değerleri okur).
Örnek:
String text = "10 20 40 80";
Scanner console = new Scanner(text);
int a = console.nextInt();
int b = console.nextInt();
ScannerSınıfın nasıl çalıştığı hakkında buradan daha fazla bilgi edinebilirsiniz .
Hepsi hafızada şu şekilde saklanacak:

Bu durumda, tek bir Stringnesne olduğu gibi bellekte kalır - yalnızca ona yapılan referanslar iletilir ve değişkenlerde saklanır.
5. StringNesnelere yapılan referansları karşılaştırma
Ve son olarak, eğlenceli kısma ulaştık: dizi karşılaştırması.
Dize değişkenlerini karşılaştırmak için kullanabileceğiniz iki işleç vardır: ==(eşittir) ve !=(eşit değildir). "Büyüktür", "küçüktür" veya "büyüktür veya eşittir" işleçlerini kullanamazsınız - derleyici buna izin vermez.
Ancak burada ilginç bir nüans var: dize değişkenlerinde gerçekte ne depolanıyor? Bu doğru: nesnelere adresler (referanslar). Ve karşılaştırılacak olan bu adreslerdir:
String text = "Hi";
String message = text;
String s1 = text.toUpperCase();
String s2 = text.toUpperCase();
İşte hafızada olacaklar:

messageve değişkenleri textaynı nesneye atıfta bulunur (adresini saklar). Ancak s1ve s2değişkenleri, çok benzer ancak farklı olan nesnelere yapılan başvuruları saklar.
Ve koddaki bu 4 değişkeni karşılaştırırsanız, aşağıdaki sonucu elde edersiniz:
| kod | Konsol çıkışı |
|---|---|
|
|
GO TO FULL VERSION