JavaRush /Java blogi /Random-UZ /Java-da avtobokslash va qutidan chiqarish
DSergey_Kh
Daraja

Java-da avtobokslash va qutidan chiqarish

Guruhda nashr etilgan
Ushbu maqolada biz Java-da autoboxing/unboxing deb nomlangan xususiyatni ko'rib chiqamiz . Autoboxing va unboxing - bu ibtidoiy turlarni ob'ekt turlariga va aksincha aylantirish funktsiyasi. Java-da autoboxing va unboxing - 1Butun jarayon Java Runtime Environment (JRE) tomonidan avtomatik ravishda amalga oshiriladi. Ammo bu funktsiyani amalga oshirishda ehtiyot bo'lishingiz kerak, chunki ... Bu sizning dasturingizning ishlashiga ta'sir qilishi mumkin.

Kirish

intJDK 1.5 dan past versiyalarda , char, float, kabi ibtidoiy ma'lumotlar turlarini doubleInteger, Character, Float, Double o'rash sinflariga aylantirish oson bo'lmadi . JDK 5 dan boshlab, ibtidoiy turlarni ekvivalent ob'ektlarga aylantiruvchi ushbu funksiya avtomatik ravishda amalga oshiriladi. Bu xususiyat Autoboxing sifatida tanilgan . Teskari jarayon, o'z navbatida, Unboxing , ya'ni. ob'ektlarni ularning mos keladigan ibtidoiy turlariga aylantirish jarayoni. Autoboxing va unboxing uchun namuna kodi quyida ko'rsatilgan: Autoboxing
Integer integer = 9;
Qutidan chiqarish
int in = 0;
in = new Integer(9);
Avtomatik qadoqlash va ochish qachon qo'llaniladi? Autoboxing Java kompilyatori tomonidan quyidagi sharoitlarda qo'llaniladi:
  • Ibtidoiy turdagi qiymat usul parametri sifatida usulga o'tkazilganda, mos keladigan o'rash sinfining ob'ekti kutiladi.
  • Primitiv turdagi qiymat mos keladigan o'rash sinfining o'zgaruvchisiga tayinlanganda.
Quyidagi misolni ko'rib chiqing: Listing 1: Autoboxingni ko'rsatadigan oddiy 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 dan oldin yuqoridagi kod kompilyatsiya xatosiga sabab bo'lardi, chunki qolgan operator % va unary plus += o'ram sinfiga qo'llanilmaydi. Lekin jdk 1.5 va undan yuqori versiyalarida bu kod xatosiz kompilyatsiya qilinadi va butun sonni ga aylantiradi int. Unboxing Java kompilyatori tomonidan quyidagi sharoitlarda qo'llaniladi:
  • Ob'ekt mos keladigan ibtidoiy turni kutadigan usulga parametr sifatida o'tkazilganda.
  • Ob'ekt mos keladigan primitiv tipdagi o'zgaruvchiga tayinlanganda.
Quyidagi misolni ko'rib chiqing: Listing 2: Qutidan chiqarishni ko'rsatadigan oddiy 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 va unboxing ishlab chiquvchiga oʻqish va tushunish oson boʻlgan kod yozish imkonini beradi. Quyidagi jadvalda ibtidoiy ma'lumotlar turlari va ularga mos keladigan o'rash ob'ektlari ko'rsatilgan.
Ibtidoiy turlar Shell sinflari
mantiqiy Mantiqiy
bayt Bayt
char Xarakter
suzmoq Float
int Butun son
uzoq Uzoq
qisqa Qisqa
1-jadval: Taqqoslash operatorlari bilan ibtidoiy turlar va ekvivalent o'rash sinflari Autoboxing va unboxing taqqoslash operatorlari bilan ishlatilishi mumkin. Quyidagi kod parchasi bu qanday sodir bo'lishini ko'rsatadi: 3-ro'yxat: taqqoslash operatori yordamida avtobokslash va qutidan chiqarishni ko'rsatadigan namunaviy 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);
  }
}
Usulni haddan tashqari yuklaganda avtomatik qadoqlash va o'ramni ochish. Avtomatik qadoqlash va o'rash usuli ortiqcha yuklanganda quyidagi qoidalar asosida amalga oshiriladi:
  • Kengayish kengayish va qadoqlash o'rtasida tanlov mavjud bo'lgan vaziyatda qadoqlash "mag'lubiyatga uchraydi"; kengaytirish afzalroqdir.
Ro'yxat 4: Haddan tashqari yuklanishning afzalliklarini ko'rsatadigan namuna kodi
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);
  }
 }
}
Dastur chiqishi - turiint
  • Kengayish o'zgaruvchan sonli argumentlarni yengadi. Kengayish va o'zgaruvchan argumentlar soni o'rtasida tanlovga aylangan vaziyatda kengaytirish afzalroqdir.
Ro'yxat 5: Haddan tashqari yuklanishning afzalliklarini ko'rsatadigan namuna kodi
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);
   }
  }
  • Qadoqlash o'zgaruvchan sonli argumentlarni yengadi. Qadoqlash va o'zgaruvchan argumentlar soni o'rtasida tanlovga aylangan vaziyatda qadoqlash afzalroqdir.
Ro'yxat 6: Haddan tashqari yuklanishning afzalliklarini ko'rsatadigan namuna kodi
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 qadoqlashdan foydalanishda quyidagilarni yodda tutishingiz kerak: Bizga ma'lumki, har bir yaxshi xususiyatning kamchiliklari bor. Avtomatik qadoqlash bu borada istisno emas. Ushbu xususiyatdan foydalanganda ishlab chiquvchi yodda tutishi kerak bo'lgan ba'zi muhim eslatmalar:
  • Ob'ektlarni ' ==' operatori bilan solishtirish chalkash bo'lishi mumkin, chunki u ibtidoiy turlar va ob'ektlarga nisbatan qo'llanilishi mumkin. Ushbu operator ob'ektlarga nisbatan qo'llanilganda, u ob'ektlarning o'ziga emas, balki ob'ektlarga havolalarni solishtiradi.
Listing 7: Taqqoslashni ko'rsatadigan namuna kodi.
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");
      }
   }
}
  • Ob'ektlar va ibtidoiy tiplarni tenglik va relyatsion operatorlar bilan aralashtirish. Agar biz ibtidoiy turni ob'ekt bilan solishtirsak, u holda ob'ekt qutisiz bo'lib, NullPointerExceptionob'ektni tashlab yuborishi mumkin null.
  • Ob'ektni keshlash. Usul valueOf()keshlanadigan ibtidoiy ob'ektlar konteynerini yaratadi. Qiymatlar keshlanganligi sababli -128 dan 127 gacha, shu jumladan, bu keshlangan ob'ektlar boshqacha harakat qilishi mumkin.
  • Ishlashning pasayishi. Autoboxing yoki unboxing dastur ish faoliyatini yomonlashtiradi, chunki u axlat yig'uvchini tez-tez ishlashga majburlaydigan kiruvchi ob'ektni yaratadi.
AutoBoxingning kamchiliklari Garchi AutoBoxing bir qator afzalliklarga ega bo'lsa-da, uning quyidagi kamchiliklari mavjud: Listing 8: Ishlash muammosini ko'rsatuvchi kod namunasi.
public int sumEvenNumbers(List intList) {
          int sum = 0;
          for (Integer i : intList) {
              if (i % 2 == 0) {
                  sum += i;
              }
          }
         return sum;
   }
Kodning ushbu qismida sum +=i u kengaytiriladi sum = sum + i. ' ' operatoridan boshlab +, JVM qutidan chiqarishni boshlaydi, chunki ' +' operatorini Integer obyektiga qo'llash mumkin emas. Va keyin natija avtomatik tarzda qayta tiklanadi. JDK 1.5 dan oldin ma'lumotlar turlari intva Integer boshqacha edi. Usul haddan tashqari yuklangan taqdirda, bu ikki tur muammosiz ishlatilgan. Avtomatik qadoqlash/ochishning paydo bo'lishi bilan bu yanada qiyinlashdi. Bunga misol qilib remove()dagi haddan tashqari yuklangan usulni keltirish mumkin ArrayList. Sinfda ArrayListikkita o'chirish usuli mavjud - remove(index)va remove(object). Bunday holda, usulning ortiqcha yuklanishi sodir bo'lmaydi va tegishli parametrlar bilan mos keladigan usul chaqiriladi.

Xulosa

Autoboxing - bu ibtidoiy ma'lumotlar turlarini mos keladigan o'rash sinflariga (ob'ektlariga) bilvosita aylantirish mexanizmi. Kompilyator valueOf()ibtidoiy turlarni ob'ektlarga aylantirish usulidan, ob'ektning ibtidoiy turlarini olish uchun esa usullardan va hokazolardan IntValue()foydalanadi . doubleValue()Autoboxing mantiqiy turini booleanMantiqiy, byteBayt, charBelgi, floatFloat, intInteger, longLong, shortShort-ga o'zgartiradi. Paketni ochish teskari yo'nalishda sodir bo'ladi. Asl maqola
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION