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.

One Comment
  1. Maillot de Foot Club

    Great, thanks for sharing this blog.Thanks Again.

Maillot de Foot Club için bir cevap yazın Cevabı iptal et

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*
*