1. Giriş
Java dilində iki müxtəlif məlumat ailəsi mövcuddur. Birincisi — primitiv tiplər: int, char, double, boolean və digərləri. Onlar sadə və sürətlidir: dəyər birbaşa yaddaş hüceyrəsində saxlanılır. İkinci ailə — bu, istinad tipləridir, yəni obyektlər: dəyişən obyektin yaddaşda yerləşdiyi yerə istinadı saxlayır.
Bəzən primitivi obyekt kimi istifadə etmək lazım gəlir. Lakin primitivlər əvvəlcədən obyekt deyil. Belə hallarda xüsusi wrapper sinifləri kömək edir.
Wrapper tipləri — daxilində primitivin dəyərini saxlayan və onunla obyekt kimi davranmağa imkan verən siniflərdir. Məsələn, int üçün — Integer sinfi, double üçün — Double, char üçün — Character, boolean üçün — Boolean. Bu siniflər belə metodlar təqdim edir: Integer.parseInt(), Double.isInfinite(), Character.isLetter(), Boolean.parseBoolean() və s.
Integer obyektinin int primitivindən alınması nümunəsi:
// Primitiv
int a = 10;
// Wrapper obyekt
Integer b = Integer.valueOf(10);
a dəyişənində 10 ədədinin özü saxlanılır. b dəyişəni isə daxilində 10 saxlayan obyektə istinadı saxlayır.
2. Wrapper-lər nə üçün lazımdır
Primitiv — həmişə konkret dəyərdir, onu null-a bərabər etmək olmur. Obyekt isə mövcud olmaya və boş dəyər saxlaya bilər — bu, “naməlum” və ya “mövcud deyil” halını göstərmək lazım olduqda rahatdır.
Primitivin metodları yoxdur. Ədəddə x.toString() kimi bir şey çağırmaq olmaz. Wrapper belə imkanlar verir: Integer.parseInt("123") sətiri ədədə çevirir, həmçinin ədədi toString() vasitəsilə sətirə çevirmək olar.
Nəticə: wrapper-lər məhz obyekt tələb olunan yerlərdə lazımdır — null-u saxlamaq imkanı, metodları çağırmaq, yalnız obyektləri qəbul edən API-lərə dəyərləri ötürmək (məsələn, List<Integer> tipli kolleksiyalar).
Wrapper tiplərinin tam siyahısı
| Primitiv tip | Wrapper sinfi |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3. Boxing və unboxing
Wrapper obyektini əl ilə yaratdıqda, primitivi götürüb onu obyektin içinə “paketləyirsiniz”:
int primitive = 42;
Integer wrapper = Integer.valueOf(primitive); // paketləmə
Primitiv dəyəri geri çıxarmaq — “paketdən çıxarmaq” — üçün, məsələn, intValue() istifadə olunur:
Integer wrapper = Integer.valueOf(42);
int primitive = wrapper.intValue(); // paketdən çıxarma
Avtoboksinq (Autoboxing)
Əgər primitiv dəyəri wrapper dəyişəninə mənimsədirsinizsə, kompilyator özü valueOf() çağırışını əlavə edəcək:
int a = 10;
Integer b = a; // avtoboksinq (Integer.valueOf(a))
Avtounboksinq (Unboxing)
Əks vəziyyət — wrapper obyektinin primitiv lazım olan yerdə istifadə olunması:
Integer c = 20;
int d = c; // avtounboksinq (c.intValue())
int a = 10; // primitiv
Integer b = a; // avtoboksinq
Integer c = Integer.valueOf(20);
int d = c; // avtounboksinq
4. Gizli tələlər
Wrapper-lərin müqayisəsi. Obyektlər üçün == operatoru istinadları, dəyərləri deyil, müqayisə edir:
Integer m = 200;
Integer n = 200;
System.out.println(m == n); // false, çünki bunlar fərqli obyektlərdir
Java rəqəmlərin wrapper-lərini -128-dən 127-yədək diapazonda keşləyir, ona görə də bəzən == true qaytaracaq, bəzən isə — false. Dəyərləri müqayisə etmək üçün həmişə equals() istifadə edin:
Integer x = 100;
Integer y = 100;
System.out.println(x == y); // true, keşə düşdü
System.out.println(x.equals(y)); // true, dəyər üzrə müqayisə
Avtounboksinq zamanı NullPointerException. Wrapper null-dırsa və siz onu açmağa çalışsanız — istisna alacaqsınız:
Integer value = null;
int primitive = value; // Səhv! NullPointerException
Performans və yaddaş. Wrapper-lər primitivlərdən daha yavaşdır və daha çox yaddaş tutur. Kiritik hissələrdə və böyük ədəd massivləri ilə işləyərkən primitivləri seçin.
5. Nümunələr
Integer və Double ilə iş nümunələri
Sətri ədədə çevirmə:
String text = "123";
int number = Integer.parseInt(text);
System.out.println(number); // 123
Həqiqi ədədlərin xüsusi dəyərlərini yoxlama:
double d = 1.0 / 0;
System.out.println(Double.isInfinite(d)); // true
double nan = 0.0 / 0.0;
System.out.println(Double.isNaN(nan)); // true
Character ilə iş nümunələri
char bir simvol saxlayır; Character wrapper-i rahat yoxlamalar verir:
char ch = 'A';
Character wrapper = ch; // avtoboksinq
System.out.println(Character.isLetter(ch)); // true
System.out.println(Character.isDigit(ch)); // false
System.out.println(Character.toLowerCase(ch)); // 'a'
Boolean ilə iş nümunələri
Primitiv boolean — yalnız true/false-dur. Boolean wrapper-i isə əlavə olaraq null saxlamağa imkan verir:
Boolean flag = null; // icazəlidir
flag = Boolean.TRUE; // xüsusi sabit
System.out.println(flag); // true
Sətirləri məntiqi dəyərlərə çevirmə:
String s1 = "true";
String s2 = "false";
boolean b1 = Boolean.parseBoolean(s1);
boolean b2 = Boolean.parseBoolean(s2);
System.out.println(b1); // true
System.out.println(b2); // false
GO TO FULL VERSION