JavaRush /Java Blogu /Random-AZ /Java-da avtoboks və qutudan çıxarma
DSergey_Kh
Səviyyə

Java-da avtoboks və qutudan çıxarma

Qrupda dərc edilmişdir
Bu yazıda biz Java-da autoboxing/unboxing adlı funksiyaya baxacağıq . Autoboxing və unboxing ibtidai növlərin obyekt tiplərinə və əksinə çevrilməsi funksiyasıdır. Java-da avtoboks və qutudan çıxarma - 1Bütün proses avtomatik olaraq Java Runtime Environment (JRE) tərəfindən həyata keçirilir. Amma bu funksiyanı həyata keçirərkən diqqətli olmalısınız, çünki... Bu, proqramınızın performansına təsir edə bilər.

Giriş

intJDK 1.5-dən aşağı olan versiyalarda , char, float, kimi primitiv məlumat növlərini doubleonların sarğı siniflərinə çevirmək asan deyildi . JDK 5-dən başlayaraq, primitiv növləri ekvivalent obyektlərə çevirən bu funksionallıq avtomatik olaraq həyata keçirilir. Bu xüsusiyyət Autoboxing kimi tanınır . Əks proses, müvafiq olaraq, Unboxing , yəni. obyektlərin onlara uyğun primitiv tiplərə çevrilməsi prosesi. Avtoboksinq və qutudan çıxarma üçün kod nümunəsi aşağıda göstərilmişdir: Avtoboksinq
Integer integer = 9;
Qutunun açılması
int in = 0;
in = new Integer(9);
Avtomatik qablaşdırma və qablaşdırmadan nə vaxt istifadə olunur? Autoboxing Java kompilyatoru tərəfindən aşağıdakı şərtlər altında istifadə olunur:
  • Primitiv tipli dəyər metod parametri kimi metoda ötürüldükdə, hansı ki, müvafiq sarğı sinifinin obyektini gözləyir.
  • Primitiv tipli dəyər müvafiq sarğı sinifinin dəyişəninə təyin edildikdə.
Aşağıdakı nümunəyə nəzər salın: Siyahı 1: Avtoboksinqi göstərən sadə kod
public int sumEvenNumbers(List<Integer> intList ) {
int sum = 0;
for (Integer i: intList )
if ( i % 2 == 0 )
sum += i;
return sum;
}
Jdk 1.5-dən əvvəl yuxarıdakı kod kompilyasiya xətasına səbəb olardı, çünki qalan operator % və unar plus += sarğı sinifinə tətbiq edilə bilməzdi. Lakin jdk 1.5 və daha yuxarı versiyalarda bu kod tam ədədi -ə çevirərək səhvsiz tərtib edilir int. Qutudan çıxarma Java kompilyatoru tərəfindən aşağıdakı şərtlər altında istifadə olunur:
  • Obyekt müvafiq primitiv növü gözləyən metoda parametr kimi ötürüldükdə.
  • Obyekt müvafiq primitiv tipli dəyişənə təyin edildikdə.
Aşağıdakı nümunəyə nəzər salın: Siyahı 2: Qutunun açılmasını göstərən sadə kod
import java.util.ArrayList;
import java.util.List;

public class UnboxingCheck {

public static void main(String[] args) {
Integer in = new Integer(-8);

// 1. Распаковка через вызов метода
int absVal = absoluteValue(in);
System.out.println("absolute value of " + in + " = " + absVal);

List<Double> doubleList = new ArrayList<Double>();

// Автоупаковка через вызов метода
doubleList.add(3.1416);

// 2. Распаковка через присвоение
double phi = doubleList.get(0);
System.out.println("phi = " + phi);
}

public static int absoluteValue(int i) {
return (i < 0) ? -i : i;
}
}
Autoboxing və unboxing tərtibatçıya oxumaq və başa düşmək üçün asan kod yazmağa imkan verir. Aşağıdakı cədvəl primitiv məlumat növlərini və onlara uyğun olan sarğı obyektlərini göstərir.
İbtidai növlər Shell sinifləri
boolean Boolean
bayt bayt
char Xarakter
sal Sal
int Tam
uzun Uzun
qısa Qısa
Cədvəl 1: Müqayisə operatorları ilə primitiv növlər və ekvivalent sarğı sinifləri Autoboxing və unboxing müqayisə operatorları ilə istifadə edilə bilər. Aşağıdakı kod parçası bunun necə baş verdiyini göstərir: Siyahı 3: Müqayisə operatoru ilə avtoboks və qutudan çıxarmanı göstərən nümunə kod
public class BoxedComparator {
  public static void main(String[] args) {
      Integer in = new Integer(25);
      if (in < 35)
          System.out.println("Value of int = " + in);
  }
}
Metod həddən artıq yükləndikdə avtomatik qablaşdırma və qablaşdırmadan çıxarma Avtomatik qablaşdırma və qablaşdırma metodu həddən artıq yüklədikdə aşağıdakı qaydalara əsasən həyata keçirilir:
  • Genişlənmə, genişləndirmə və qablaşdırma arasında seçim olduğu bir vəziyyətdə qablaşdırmanı "məğlub edir"; genişləndirməyə üstünlük verilir.
Siyahı 4: Həddindən artıq yükləmənin faydasını göstərən nümunə kod
public class WideBoxed {
  public class WideBoxed {
  static void methodWide(int i) {
       System.out.println("int");
   }

  static void methodWide( Integer i ) {
      System.out.println("Integer");
  }

  public static void main(String[] args) {
      short shVal = 25;
      methodWide(shVal);
  }
 }
}
Proqram çıxışı - növüint
  • Genişlənmə arqumentlərin dəyişən sayını üstələyir Genişlənmə və dəyişən arqumentlər arasında seçimə çevrildiyi bir vəziyyətdə, genişləndirməyə üstünlük verilir.
Siyahı 5: Həddindən artıq yükləmənin faydasını göstərən nümunə kod
public class WideVarArgs {

    static void methodWideVar(int i1, int i2) {
      System.out.println("int int");
    }

    static void methodWideVar(Integer... i) {
       System.out.println("Integers");
    }

   public static void main( String[] args) {
       short shVal1 = 25;
      short shVal2 = 35;
     methodWideVar( shVal1, shVal2);
   }
  }
  • Qablaşdırma arqumentlərin dəyişən sayını atır. Qablaşdırma və dəyişən arqumentlər arasında seçimə çevrildiyi bir vəziyyətdə qablaşdırmaya üstünlük verilir.
Siyahı 6: Həddindən artıq yükləmənin faydasını göstərən nümunə kod
public class BoxVarargs {
     static void methodBoxVar(Integer in) {
         System.out.println("Integer");
     }

     static void methodBoxVar(Integer... i) {
         System.out.println("Integers");
     }
     public static void main(String[] args) {
         int intVal1 = 25;
         methodBoxVar(intVal1);
    }
}
Avtomatik Qablaşdırmadan istifadə edərkən aşağıdakıları nəzərə almalısınız: Bildiyimiz kimi, hər bir yaxşı xüsusiyyətin çatışmazlıqları var. Avtomatik qablaşdırma da bu baxımdan istisna deyil. Bu xüsusiyyətdən istifadə edərkən tərtibatçının yadda saxlamalı olduğu bəzi vacib qeydlər:
  • Obyektləri ' ==' operatoru ilə müqayisə etmək çaşqınlıq yarada bilər, çünki o, primitiv tiplərə və obyektlərə tətbiq oluna bilər. Bu operator obyektlərə tətbiq edildikdə, o, əslində obyektlərin özlərinə deyil, obyektlərə istinadları müqayisə edir.
Siyahı 7: Müqayisəni göstərən nümunə kodu.
public class Comparator {
   public static void main(String[] args) {
     Integer istInt = new Integer(1);
       Integer secondInt = new Integer(1);

       if (istInt == secondInt) {
         System.out.println("both one are equal");

       } else {
          System.out.println("Both one are not equal");
      }
   }
}
  • Obyektlərin və primitiv tiplərin bərabərlik və əlaqə operatorları ilə qarışdırılması. Bir ibtidai növü obyektlə müqayisə etsək, o zaman obyekt qutusuzdur, NullPointerExceptionobyekti atmaq olar null.
  • Obyektin keşləşdirilməsi. Metod valueOf()önbelleğe aldığı ibtidai obyektlərin konteynerini yaradır. Dəyərlər -128-dən 127-ə qədər diapazonda saxlandığı üçün bu keşlənmiş obyektlər fərqli davrana bilər.
  • Performansın azalması. Avtoboks və ya qutudan çıxarma tətbiqin performansını aşağı salır, çünki bu, zibil yığıcını daha tez-tez işləməyə məcbur edən arzuolunmaz obyekt yaradır.
AutoBoxing-in çatışmazlıqları AutoBoxing bir sıra üstünlüklərə malik olsa da, onun aşağıdakı çatışmazlıqları var: Siyahı 8: Performans problemini göstərən nümunə kod.
public int sumEvenNumbers(List intList) {
          int sum = 0;
          for (Integer i : intList) {
              if (i % 2 == 0) {
                  sum += i;
              }
          }
         return sum;
   }
Kodun bu bölməsində sum +=i o, genişləndiriləcək sum = sum + i. ' ' operatorundan başlayaraq +JVM qutudan çıxarmağa başlayır, çünki ' +' operatoru Tam ədəd obyektinə tətbiq edilə bilməz. Və sonra nəticə avtomatik olaraq geri qaytarılır. JDK 1.5-dən əvvəl məlumat növləri intvə Tam ədəd fərqli idi. Metodun həddindən artıq yüklənməsi halında, bu iki növ problemsiz istifadə edilmişdir. Avtomatik qablaşdırmanın/qablaşdırmanın meydana çıxması ilə bu, daha da çətinləşdi. remove()Buna misal olaraq ArrayList. Sinfin ArrayListiki silmə üsulu var - remove(index)remove(object). Bu halda metodun həddən artıq yüklənməsi baş verməyəcək və müvafiq parametrlərlə müvafiq metod çağırılacaq.

Nəticə

Autoboxing ibtidai məlumat növlərini müvafiq sarğı siniflərinə (obyektlərə) dolayı çevirmək mexanizmidir. Kompilyator valueOf()ibtidai tipləri obyektlərə çevirmək üçün metoddan, obyektin primitiv növlərini əldə etmək üçün isə metodlardan və s.- IntValue()dən istifadə edir. doubleValue()Autoboxing boolean tipini booleanBoolean, byteBayt, charCharacter, floatFloat, intInteger, longLong, shortShort-a çevirir. Qablaşdırma tərs istiqamətdə baş verir. Orijinal məqalə
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION