TL; DR
Java, -128
ile arasındaki kutulu Tamsayı örneklerini önbelleğe alır 127
. Değerler yerine ==
nesne referanslarını karşılaştırmak için kullandığınızdan , yalnızca önbelleğe alınan nesneler eşleşecektir. Kutusuz ilkel değerlerle çalışın veya nesnelerinizi karşılaştırmak için kullanın .long
.equals()
Long
Uzun (amaçlanan) versiyon
Uzun değişkeni 127'den büyük değerle karşılaştırmada neden sorun var? Yukarıdaki değişkenin veri türü ilkel (uzun) ise, kod tüm değerler için çalışır.
Java, -128 ile 127 aralığındaki Tamsayı nesne örneklerini önbelleğe alır . Bahsedilen:
- N Uzun değişkene değeri
127
( önbelleğe alınmış ) ayarlarsanız , aynı nesne örneği tüm referanslar tarafından gösterilecektir. (N değişken, 1 örnek)
- Değeri N Uzun değişkene ayarlarsanız
128
( önbelleğe alınmaz ), her referansın işaret ettiği bir nesne örneğiniz olur. (N değişken, N örnek)
Bu yüzden bu:
Long val1 = 127L;
Long val2 = 127L;
System.out.println(val1 == val2);
Long val3 = 128L;
Long val4 = 128L;
System.out.println(val3 == val4);
Şu çıktılar:
doğru
yanlış
İçin 127L bellek (önbelleğe) aynı nesne örneğine Her iki referans (VAL1 ve val2) noktasında bu değer, bu döner true
.
Öte yandan, 128 değeri için, bellekte önbelleğe alınmış bir örnek olmadığından, kutulu değerler için yeni atamalar için yeni bir tane oluşturulur ve sonuçta iki farklı durum (val3 ve val4 ile gösterilir) ve geri döner false
. aralarında karşılaştırma.
Bunun nedeni yalnızca , ilkel değerleri değil, iki Long
nesne referansını operatörle karşılaştırmanızdır. Bu Önbellek mekanizması olmasaydı, bu karşılaştırmalar her zaman başarısız olurdu, bu nedenle buradaki asıl sorun, kutulu değerleri operatörle karşılaştırmaktır .long
==
==
Bu değişkenleri ilkel long
türlere dönüştürmek, bunun olmasını engelleyecektir, ancak kodunuzu Long
nesneleri kullanarak tutmanız gerektiğinde , bu karşılaştırmaları aşağıdaki yaklaşımlarla güvenle yapabilirsiniz:
System.out.println(val3.equals(val4)); // true
System.out.println(val3.longValue() == val4.longValue()); // true
System.out.println((long)val3 == (long)val4); // true
(Dökümler için bile uygun sıfır kontrolü gereklidir)
IMO , Nesne karşılaştırmalarıyla uğraşırken .equals () yöntemlerine bağlı kalmak her zaman iyi bir fikirdir .
Referans bağlantıları:
.longValue()
.