CodeGym /Kurslar /Java SELF AZ /Wrapper tipləri ətraflı

Wrapper tipləri ətraflı

Java SELF AZ
Səviyyə , Dərs
Mövcuddur

1. Integer Sinfi

Integer həm də ona görə yaxşıdır ki, bu bir sinifdir, yəni, onun sahələri və metodları ola bilər. Və əlbəttə, bunlar var. Hətta çoxdur — bir neçə onlarla. Buna görə də biz onların əsaslarını nəzərdən keçirəcəyik.

Integer sinfinin int tipinin maksimal və minimal dəyərini saxlayan iki sahəsi var:

Sahə Şərh
Integer.MAX_VALUE
int tipinin maksimal dəyəri
Integer.MIN_VALUE
int tipinin minimal dəyəri

Bəzən dəyişənə int tipinin ən kiçik və ya ən böyük dəyərini təyin etmək istəyirsən. Kodu anlaşılmaz sabitlərlə qarışdırmamaq üçün bunu çox gözəl formada yaza bilərsən:

Kod Şərh
int min = Integer.MIN_VALUE;
min 0x80000000 olacaq

Həmçinin Integer sinfində bir neçə maraqlı metod var, bunlar:

Metodlar Şərh
String Integer.toHexString(int)
Ədədin onaltılıq göstərilməsini qaytarır
String Integer.toBinaryString(int)
Ədədin ikilik göstərilməsini qaytarır
String Integer.toOctalString(int)
Ədədin səkkizlik göstərilməsini qaytarır
Integer Integer.valueOf(int i)
Verilən int-i Integer-ə çevrilir
Integer Integer.parseInt(String)
Sətirdən alınan ədədi qaytarır

Əvvəlcə siz artıq Integer.parseInt() statik metodu ilə tanış idiniz. Gəlin, onun necə işlədiyini xatırlayaq:

int ad = Integer.parseInt(mətin);

Əgər parseInt() metoduna sadəcə ədədlərdən ibarət olan bir sətir keçirsən, bu metod həmin sətri parse edəcək və içindəki ədədi qaytaracaq.

Digər metodlar da faydalıdır. Məsələn, bunlardan bəziləri verilmiş ədədi təsviri ikilik, səkkizlik və ya onaltılıq formada olan sətrə çevirə bilər.



2. Double Sinfi

Double sinfi, əslində, Integer sinfinin analoqudur, yalnız bu sinif int tipi üçün deyil, double tipi üçün wrapper rolunu oynayır. Bu sinfin də maraqlı sahələri və metodları var, bəzi sahələrə nəzər salaq:

Double sinfinin altı maraqlı sahəsi var:

Sahə Təsvir
double Double.NEGATIVE_INFINITY
Mənfi sonsuzluq
double Double.POSITIVE_INFINITY
Müsbət sonsuzluq
int Double.MIN_EXPONENT
Eksponentin minimal dəyəri (2x)
int Double.MAX_EXPONENT
Eksponentin maksimal dəyəri (2x)
double Double.MIN_VALUE
double tipinin minimal dəyəri
double Double.MAX_VALUE
double tipinin maksimal dəyəri

Sonsuzluq

Əgər siz -1.0 ədədi 0.0 ədədinə bölsəniz, mənfi sonsuzluq əldə edəcəksiniz, əgər 1.0 ədədi 0.0 ədədinə bölsəniz — müsbət sonsuzluq əldə edəcəksiniz. double tipi nəinki sıfıra bölə bilir, həmçinin belə dəyərləri saxlaya bilir.

double ədədinin eksponenti

Eksponentlə də hər şey sadədir. Double ədədin içində manqtisa və eksponent var. Lakin eksponentin dəyəri 10x deyil, 2x olur. Eksponent 1 artırsa, nəticədə alınan ədəd iki dəfə çoxalır.

MIN_EXPONENT == -1024, nəticədə biz 2-1024 alırıq, bu isə təqribən 10-308-ə bərabərdir.

Həmçinin, Double sinfinin maraqlı metodları var:

Metodlar Təsvir
String Double.toHexString(double)
Ədədi onaltılıq təqdimat şəklində qaytarır
boolean Double.isInfinite(double)
Verilən ədədin sonsuzluq olub olmadığını yoxlayır.
boolean Double.isNaN(double)
Verilən ədədin NaN olub olmadığını yoxlayır
Double Double.valueOf(double)
Verilən double ədədini Double tipinə çevirir
Double Double.parseDouble(String)
Sətirdən alınmış ədədi qaytarır

Maraqlı məqam odur ki, isInfinite() metodu mövcuddur və əgər bu metodun argumentinə müsbət və ya mənfi sonsuzluq verilsə, o zaman true qaytarır.

isNaN() metodu da oxşayır — bu metod argument olaraq alınan ədədin NaN (dəqiq olmayan dəyər, Not a Number, Rəqəm deyil) olub olmadığını yoxlayır.



3. Character Sinfi

Character sinfi əsasən müxtəlif kateqoriyalara aidiyyatını yoxlamağa imkan verən bir çox istifadəçi statik metodları ilə maraqlıdır.

Nümunələr

Metodlar Təsvir
Character.isAlphabetic(int)
Simvolun əlifba simvolu olub olmadığını yoxlayır
Character.isLetter(char)
Simvol hərfdir?
Character.isDigit(char)
Simvol rəqəmdir?
Character.isSpaceChar(char)
Simvol boşluq, yeni sətr və ya paraqrafın dəyişməsi simvoludurmu? (kodlar: 12, 13, 14)
Character.isWhitespace(char)
Simvol ayırıcıdırmı: boşluq, tab və s.?
Character.isLowerCase(char)
Kiçik hərf — kiçik registerdədirmi?
Character.isUpperCase(char)
Böyük hərf — böyük registerdədirmi?
Character.toLowerCase(char)
Simvolu kiçik registerə çevirir
Character.toUpperCase(char)
Simvolu böyük registerə çevirir

Bu metodların xüsusiyyəti ondan ibarətdir ki, onlar bütün tanınmış əlifbalarla işləyir: ərəb rəqəmləri də rəqəm kimi müəyyən ediləcək və s.



4. Boolean Classı

Boolean tipi demək olar ki, boolean tipi kimidir. Fərqlər minimaldır.

Aşağıda Boolean class-ının sadələşdirilmiş bir nümunəsini göstərəcəyik:

Kod Təsvir
class Boolean
{
   public static final Boolean TRUE = new Boolean(true);
   public static final Boolean FALSE = new Boolean(false);

   private final boolean value;

   public Boolean(boolean value)
   {
      this.value = value;
   }

   public boolean booleanValue()
   {
      return value;
   }

   public static Boolean valueOf(boolean value)
   {
      return (value ? TRUE : FALSE);
   }
}


Konstantlar: TRUEFALSE


Dəyər dəyişəni

Boolean class-ının konstruktoru




Metod daxili dəyişən dəyərini qaytarır



Bu statik metod true-nu TRUE-ya və false-u FALSE-a çevirmək bacarığına malikdir.

Boolean tipində iki konstant (iki sahə) var:

Class Konstantları boolean Tipinə Analog Təsvir
Boolean.TRUE
true
doğru
Boolean.FALSE
false
yanlış

Bunlarla boolean tipi ilə olduğu kimi işləyə bilərsiniz:

Kod Qeyd
if (Boolean.TRUE)
{
}
Boolean — tək class-dır ki, onu şərt daxilində yaza bilərsiniz
Boolean a = Boolean.TRUE;
boolean b = Boolean.TRUE;
boolean с = true;
Bütün üç dəyişən true/TRUE-yə bərabərdir
Boolean a = Boolean.TRUE;
Boolean b = Boolean.TRUE;
if (a == b)
Konstantları equals və həmçinin == vasitəsilə müqayisə etmək mümkündür

Bu da işləyəcək.

Autoboxing burada mükəmməl işləyir, ona görə də bu tipi boolean tipi kimi istifadə edə bilərsiniz: heç bir gizli problem yoxdur.

Necə yazılıb Necə işləyir
Boolean a = true;
Boolean b = true;
Boolean c = false;
boolean d = a;
Boolean a = Boolean.valueOf(true);
Boolean b = Boolean.valueOf(true);
Boolean c = Boolean.valueOf(false);
boolean d = a.booleanValue();

Və beləliklə, booleanBoolean tipləri arasında müqayisələr necə aparılır:

boolean a = true;
Boolean b = true; // Boolean.TRUE bərabər olacaq
Boolean c = true; // Boolean.TRUE bərabər olacaq

a == b; // true (sadə tiplər kimi dəyərlərinə görə müqayisə edilir)
a == c; // true (sadə tiplər kimi dəyərlərinə görə müqayisə edilir)
b == c; // true (istifadə olunan obyektlər eyni olduğu üçün göstəricilər üzrə müqayisə edilir)

Əgər müstəqil bir Boolean obyekt yaratmaq istəyirsinizsə, onu açıq şəkildə yaradın:

boolean a = true;
Boolean b = new Boolean(true); // yeni Boolean obyekti
Boolean c = true; // Boolean.TRUE bərabər olacaq

a == b; // true (sadə tiplər kimi dəyərlərinə görə müqayisə edilir)
a == c; // true (sadə tiplər kimi dəyərlərinə görə müqayisə edilir)
b == c; // false (göstəricilər üzrə müqayisə edilir, fərqli obyektlər göstərilir)

Və daha bir nümunə: Boolean şərt daxilində istifadə:

Kod Qeyd
Boolean less = (2 < 3);
if (less)
{
   ...
}
Kompilyasiya olunacaq və işləyəcək

Kompilyasiya olunacaq, amma işləməyəcək:

Kod Qeyd
Boolean less = null;
if (less)
{
   ...
}

Səhv. Bu sətirdə istisna atılacaq


5. Autoboxing zamanı dəyərlərin keşi

Bax, tam ədədi wrapper tiplərində bəzi gözlənilmələr var.

Artıq bildiyiniz kimi, əgər intInteger-i müqayisə edirsinizsə, Integer int-ə çevrilir:

Necə yazılmışdır Necə işləyir
int a = 5;
Integer b = 5;
if (a == b)
{
   ...
}
int a = 5;
Integer b = Integer.valueOf(5);
if (a == b.intValue())
{
   ...
}

İki Integer obyektinə bir-biri ilə müqayisə etsəniz, onlar int tipə çevrilməyəcək:

Kod Ekrana çıxış
Integer a = 500;
Integer b = 500;
int c = 500;

System.out.println(a == b); // referansların müqayisəsi
System.out.println(a == c);
System.out.println(b == c);




false
true
true

Hərçənd a == cb == c, lakin a != b, çünki ab müqayisə edilərkən referanslar müqayisə olunur. Bu isə gözləniləndir.

Gözləntidən kənar nəticə

Amma, əgər biz 500100-lə əvəz etsək, tamam fərqli nəticə alacağıq:

Kod Ekrana çıxış
Integer a = 100;
Integer b = 100;
int c = 100;

System.out.println(a == b); // referansların müqayisəsi
System.out.println(a == c);
System.out.println(b == c);




true
true
true

Səbəb ondadır ki, autoboxing zamanı hər zaman həqiqətən yeni Integer obyekti yaradılmır. -128-dən 127-yə qədər olan dəyərlər keş edilir.

Integer sinfində gizli bir massiv var, bu massiv obyektləri saxlayır: Integer(-128), Integer(-127), ... Integer(126), Integer(127)

Əgər siz Integer x = 128 yazsanız, autoboxing yeni obyekt yaradacaq, amma Integer x = 127 yazsanız, autoboxing keşdən (massivdən) hazır obyekt götürəcək.

Əgər Integer obyektinin keşdən götürülməsini istəmirsinizsə, o zaman onu açıq şəkildə yaratmalısınız: Integer x = new Integer(127);

Bu cür keşi bütün wrapper tipləri, məsələn: Integer, Long, Byte, Short, Boolean dəstəkləyir. Boolean tipində onun hər iki dəyəri TRUEFALSE dəyişməzlərdir: mahiyyətcə də keş edilir.


Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION