JavaRush /Java блогу /Random-KY /Java'да автобокс жана кутудан чыгаруу
DSergey_Kh
Деңгээл

Java'да автобокс жана кутудан чыгаруу

Группада жарыяланган
Бул макалада биз Javaдагы autoboxing/unboxing деп аталган функцияны карайбыз . Autoboxing жана unboxing - бул примитивдүү типтерди an objectтин түрлөрүнө жана тескерисинче конвертлөө функциясы. Java'да автобокс жана кутудан чыгаруу - 1Бардык процесс Java Runtime Environment (JRE) тарабынан автоматтык түрдө аткарылат. Бирок бул функцияны ишке ашырууда этият болушуңуз керек, анткени... Бул сиздин программаңыздын иштешине таасир этиши мүмкүн.

Киришүү

JDK 1.5тен төмөн versionларда , , , intсыяктуу charпримитивдүү берorштердин түрлөрүн алардын бүтүн, Белги, Float, Double орогуч класстарына айландыруу оңой болгон жок. JDK 5тен баштап, примитивдүү типтерди эквиваленттүү an objectтерге айландырган бул функция автоматтык түрдө ишке ашырылат. Бул касиет Autoboxing деп аталат . Тескери процесс, тиешелүүлүгүнө жараша, Unboxing , б.а. an objectтерди аларга тиешелүү примитивдүү түргө айландыруу процесси. Автобокс жана кутудан чыгаруу үчүн үлгү code төмөндө көрсөтүлгөн: Autoboxingfloatdouble
Integer integer = 9;
кутудан чыгаруу
int in = 0;
in = new Integer(9);
Автоматтык таңгактоо жана таңгактан чыгаруу качан колдонулат? Autoboxing Java компилятору тарабынан төмөнкү шарттарда колдонулат:
  • Примитивдик типтеги маани метод параметри катары методго өткөндө, ал тиешелүү орогуч классынын an objectисин күтөт.
  • Примитивдик типтеги маани тиешелүү орогуч классынын өзгөрмөсүнө ыйгарылганда.
Төмөнкү мисалды карап көрөлү: Листинг 1: Автобоксту көрсөткөн жөнөкөй code
public int sumEvenNumbers(List<Integer> intList ) {
int sum = 0;
for (Integer i: intList )
if ( i % 2 == 0 )
sum += i;
return sum;
}
jdk 1.5ке чейин жогорудагы code компиляция катасын жаратмак, анткени % оператору жана унардык плюс += орогуч классына колдонулушу мүмкүн эмес. Бирок jdk 1.5 жана андан жогору бул code бүтүн санды int. Unboxing Java компилятору тарабынан төмөнкү шарттарда колдонулат:
  • Объект тиешелүү примитивдик типти күткөн методго параметр катары өткөндө.
  • Объект тиешелүү примитивдик типтеги өзгөрмөгө дайындалганда.
Төмөнкү мисалды карап көрөлү: Листинг 2: кутудан чыгарууну көрсөткөн жөнөкөй code
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 жана unboxing иштеп чыгуучуга окууга жана түшүнүүгө оңой code жазууга мүмкүндүк берет. Төмөнкү tableда примитивдик берorштердин түрлөрү жана аларга тиешелүү орогуч an objectтери көрсөтүлгөн.
Примитивдүү түрлөрү Shell класстары
логикалык логикалык
byte Байт
char Каарман
сүзүү Float
int бүтүн сан
узун Long
кыска Кыска
1-table: Салыштыруу операторлору менен примитивдик типтер жана эквиваленттүү орогуч класстары Autoboxing жана unboxing салыштыруу операторлору менен колдонулушу мүмкүн. Төмөнкү code үзүндүсү мунун кандай болорун көрсөтөт: 3-листинг: салыштыруу оператору менен автобоксту жана кутудан чыгарууну көрсөткөн үлгү code
public class BoxedComparator {
  public static void main(String[] args) {
      Integer in = new Integer(25);
      if (in < 35)
          System.out.println("Value of int = " + in);
  }
}
Методду ашыкча жүктөөдө автопакеттөө жана таңгактан чыгаруу Автопакеттөө жана таңгактан чыгаруу методду ашыкча жүктөөдө төмөнкү эрежелердин негизинде ишке ашырылат:
  • Кеңейтүү кеңейтүү менен таңгактын ортосунда тандоо бар кырдаалда таңгакты "жеңет"; кеңейтүү артык.
Листинг 4: Ашыкча жүктөөнүн пайдасын көрсөткөн үлгү codeу
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);
  }
 }
}
Программанын чыгарылышы - түрүint
  • Кеңейтүү аргументтердин өзгөрүлмө санын жеңет. Кеңейтүү менен аргументтердин өзгөрүлмө санынын ортосунда тандоо болуп калган кырдаалда кеңейтүү артык.
Листинг 5: Ашыкча жүктөөнүн пайдасын көрсөткөн үлгү codeу
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);
   }
  }
  • Таңгактоо аргументтердин өзгөрүлмө санын жеңет. Бул таңгактоо менен аргументтердин өзгөрүлмө санынын ортосунда тандоо болуп калган кырдаалда таңгактоо артык.
Листинг 6: Ашыкча жүктөөнүн пайдасын көрсөткөн үлгү codeу
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);
    }
}
Auto Packing колдонууда төмөнкү нерселерди эстен чыгарбашыңыз керек: Биз билгендей, ар бир жакшы функциянын кемчorги бар. Автоматтык таңгак бул жагынан өзгөчө эмес. Бул функцияны колдонууда иштеп чыгуучу эске алышы керек болгон кээ бир маанилүү эскертүүлөр:
  • Объекттерди ' ==' оператору менен салыштыруу баш аламан болушу мүмкүн, анткени ал примитивдүү типтерге жана an objectтерге колдонулушу мүмкүн. Бул оператор an objectтерге колдонулганда, ал an objectтердин өзүнө эмес, an objectтерге шилтемелерди салыштырат.
Листинг 7: Салыштырууну көрсөткөн үлгү codeу.
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");
      }
   }
}
  • Объекттерди жана примитивдүү типтерди теңдик жана реляциялык операторлор менен аралаштыруу. Эгерде биз примитивдик типти an object менен салыштырсак, анда an object кутудан чыгарылат, ал NullPointerExceptionan object болсо ыргыта алат null.
  • Объектти кэштөө. Метод valueOf()кэште турган примитивдүү an objectтердин контейнерин түзөт. Маанилер -128ден 127ге чейинки диапазондо кэштелгендиктен, бул кэштелген an objectтер башкача иштеши мүмкүн.
  • Иштин начарлашы. Автобокс же кутудан чыгаруу колдонмонун иштешин начарлатат, анткени ал таштанды жыйноочуну тез-тез иштетүүгө мажбурлаган керексиз an objectти жаратат.
Автобокстун кемчorктери Автобокстун бир катар артыкчылыктары болсо да, анын төмөнкү кемчorктери бар: Листинг 8: Өндүрүмдүүлүк маселесин көрсөткөн үлгү code.
public int sumEvenNumbers(List intList) {
          int sum = 0;
          for (Integer i : intList) {
              if (i % 2 == 0) {
                  sum += i;
              }
          }
         return sum;
   }
Коддун бул бөлүмүндө sum +=i ал кеңейтилет sum = sum + i. ' ' операторунан баштап +, JVM кутудан чыгара баштайт, анткени ' +' операторун Integer an objectине колдонууга болбойт. Андан кийин натыйжа автоматтык түрдө кайра жүктөлөт. JDK 1.5ке чейин берorштердин түрлөрү intжана бүтүн сан башка болгон. Метод ашыкча жүктөлгөн учурда, бул эки түрү көйгөйсүз колдонулган. Автоматтык таңгактоо / таңгактоо пайда болушу менен, бул кыйын болуп калды. remove()Буга мисал катары ашыкча жүктөө ыкмасы болуп саналат ArrayList. Класста ArrayListэки жок кылуу ыкмасы бар - remove(index)жана remove(object). Бул учурда, ыкма ашыкча жүктөлбөйт жана тиешелүү ыкма тиешелүү параметрлер менен чакырылат.

Корутунду

Autoboxing - бул примитивдүү берorштердин түрлөрүн тиешелүү орогуч класстарга (an objectтерге) кыйыр түрдө айландыруу механизми. Компилятор valueOf()примитивдик типтерди an objectтерге айландыруу үчүн методду, ал эми an objectтин алгачкы түрлөрүн алуу үчүн методдорду ж.б. IntValue()колдонот . Autoboxing буль түрүн логикалык түргө, byteка, символго, калкыма, бүтүн санга, узун жана кыска түргө doubleValue()которот . Пакеттен чыгаруу тескери багытта ишке ашат. Оригиналдуу макалаbooleanbytecharfloatintlongshort
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION