Merhaba Arkadaslar,
Bu yazimda Boxing , AutoBoxing , Unboxing , AutoUnboxing gibi konulardan ve giris olacak sekilde Wrapper siniflarda == (equality operatoru) ve equals metodundan bahsedecegim.
Boxing ve Unboxing islemleri , Wrapper siniflarin daha elverisli bir sekilde (convenient) kullanilmasini saglar.
Java 5 oncesinde bu ozellikler bulunmamaktaydi;
// Java 5 oncesi // Pre java 5 Integer y = new Integer(1000); // olustur int x = y.intValue(); //ac x++; // kullan y = new Integer(x); // tekrar olustur System.out.println("y=" + y); // ekrana bas
Java 5 sonrasinda ise su sekilde kullanilabilir ;
Integer y = new Integer(1000); // olustur y++; // ac , kullan,tekrar olustur System.out.println("y=" + y); //ekrana bas
Bu kodlara zaten bircogumuz zaten asinayiz, ama kavramlari ogrenmekte ve detaylica incelemekte fayda var, Java ciddi bir dildir gereken ozeni gostermek gerekir.
primitive/ilkel tipteki (int, float,long) degiskenlerin , atama islemlerinde (assignment), ilgili Wrapper sinif tipine otomatik olarak donusturulmesi islemine autoboxing denir.
Integer i = Integer.valueOf(10); //valueOf metodunu bir onceki yazida incelemistik //ya da Integer i2 = new Integer(10); //ifadeleri ile Wrapper tipe donusturmek (boxing) yerine Integer i3 = 10; //seklinde kullanim ile autoboxing islemi yapilarak Wrapper tipe //otomatik olarak donusum yapilabilir (autoboxing)
int primitive = 10; Integer autoboxing = primitive; Integer autoboxing2 = 100; Double autoboxing3 = 100d; // Double autoboxing4=100; // int Double 'a donusturulemez. Long autoboxing5 = 100L; // Long autoboxing6 =100; //int Long'a donusturulemez. //not bol miktarda kod yazip deneyin
Wrapper sinif tiplerindeki degiskenlerin , otomatik olarak , ilgili primitive/ilkel tipe donusturulmesine auto-unboxing denilir.
Integer i = new Integer(10); //boxing int autoboxing = i.intValue(); //unboxing // seklinde boxing ve unboxing islemleri yapilabilir // Integer i2 = 10; // seklinde auto-boxing islemi gerceklestirilir int i3=i2; //auto-unboxing islemi
int auto_unboxing = 0; Integer i = new Integer(10); auto_unboxing = i; long auto_unboxing2 = new Long(10); double auto_unboxing3 = new Double(10); //not: diger tipler icin de bol miktar ornek yazin
== ve equals kullanimi
Test sinifimiz inceleyelim;
public class Test { public static void main(String[] args) { Integer i = 100; Integer i2 = 100; System.out.println(i == i2); // true System.out.println(i == 100); // true System.out.println(i.equals(i2)); // true System.out.println(i.equals(100)); // true } }
Muhtemelen tum sonuclar beklediginiz sonuclardi. Peki 100 yerine 1000 olarak degistirelim ;
public class Test { public static void main(String[] args) { Integer i = 1000; Integer i2 = 1000; System.out.println(i == i2); // false System.out.println(i == 1000); // true System.out.println(i.equals(i2)); // true System.out.println(i.equals(1000)); // true } }
Beklemedigimiz sekilde i==i2 ifadesi false dondu. Farkli wrapper instance’lari icin memory/bellek kazanmak amacli Java ;
Boolean
Byte
Character \u000 dan \u007f
Short ve Integer -128 den 127 ye kadar esitlik varsa true degeri dondurecektir.
Boolean b = true; Boolean b2 = true; System.out.println("Boolean Test"); System.out.println(b==b2); //true System.out.println(b.equals(b2)); //true Short s = 100; Short s2 = 100; System.out.println("Short Test"); System.out.println(s==s2); //true System.out.println(s.equals(s2)); //true
new ile farkli 2 instance olusturdugumuzda ise asagidaki durumlar ortaya cikmaktadir. Object sinifinda equals metodu bulunmaktadir. Wrapper siniflar equals() metodunu override etmektedir. Bu nedenle new anahtar kelimesiyle olusturulan farkli 2 instance equals() metodunda true dondurecektir. Ilerleyen yazilarda equals, hashCode gibi konulari inceleyecegiz. Simdilik bu kadar bilgi veriyorum, fazla kafa karisikligina yol acmayalim
Object sinifindaki equals metodu
public boolean equals(Object obj) { return (this == obj); }
Integer sinifindaki override edilmis equals metodu ;
public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; }
Test sinifimiz ;
public class Test2 { public static void main(String[] args) { Integer i =new Integer(10); Integer i2 =new Integer(10); System.out.println("Integer Test"); System.out.println(i==i2); //false System.out.println(i.equals(i2)); //true System.out.println(i==10); //true System.out.println(i.equals(10)); //true Long lo1 = new Long(10); Long lo2 = new Long(10); System.out.println("Long Test"); System.out.println(lo1==lo2); //false System.out.println(lo1.equals(lo2)); //true System.out.println(lo1==10); //true System.out.println(lo1.equals(10)); //false System.out.println("Long - Integer Test"); System.out.println(lo1.equals(i)); //false //System.out.println(lo1==i); //compiler error } }
Bu konuda bol miktar kod yazarak incelemeler yapmanizi oneririm.
Son olarak , Wrapper referans degiskenleri null degerde olabilir , bu nedenle meshur NullPointerException’a neden olabilir.
public class Test2 { static Integer x; // null public static void main(String[] args) { int t = 10; System.out.println(x + t); // null +10 ? NPE ! } }
Ilerleyen yazilarda bu konulari tekrar farkli yonlerinde inceleyecegiz. Simdilik yazimi burada sonlandiriyorum.
Maillot de Foot Club
Great, thanks for sharing this blog.Thanks Again.