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:

Dizeler hafızada nasıl düzenlenir?

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:

Bir dizgeye referanslar atama

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:

Referanslar ve nesnelerle çalışma

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:

Referanslar ve nesnelerle çalışma.  Tarayıcı sınıfı

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:

Başvuruları String nesneleri ile karşılaştırma

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ışı
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