Pure Java – 35 Wrapper Classes – 03

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.

Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
injavawetrust

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *