JavaRush /Java блогы /Random-KK /Java тіліндегі автобокс және қораптан шығару
DSergey_Kh
Деңгей

Java тіліндегі автобокс және қораптан шығару

Топта жарияланған
Бұл мақалада біз Java тіліндегі autoboxing/unboxing деп аталатын мүмкіндікті қарастырамыз . Автобокс және қораптан шығару қарабайыр типтерді нысан түрлеріне және керісінше түрлендіру функциясы болып табылады. Java тіліндегі автобокс және қораптан шығару - 1Бүкіл процесс Java Runtime Environment (JRE) арқылы автоматты түрде орындалады. Бірақ бұл функцияны орындау кезінде абай болу керек, себебі... Бұл сіздің бағдарламаңыздың өнімділігіне әсер етуі мүмкін.

Кіріспе

intJDK 1.5-тен төмен нұсқаларда , char, float, сияқты қарапайым деректер түрлерін doubleолардың Integer, Character, Float, Double орауыш сыныптарына түрлендіру оңай болмады . JDK 5-тен бастап, қарапайым түрлерді баламалы нысандарға түрлендіретін бұл функция автоматты түрде жүзеге асырылады. Бұл қасиет Autoboxing ретінде белгілі . Кері процесс, тиісінше, Unboxing , яғни. an objectілерді олардың сәйкес қарабайыр түрлеріне түрлендіру процесі. Автобокс пен қораптан шығарудың үлгі codeы төменде келтірілген: Автобокс
Integer integer = 9;
Қораптан шығару
int in = 0;
in = new Integer(9);
Автоматты буып-түю және ораудан босату қашан қолданылады? Autoboxing Java компиляторымен келесі шарттарда қолданылады:
  • Қарапайым түрдің мәні әдіс параметрі ретінде әдіске жіберілгенде, ол сәйкес орауыш класының нысанын күтеді.
  • Қарапайым түрдің мәні сәйкес орауыш класының айнымалысына тағайындалғанда.
Келесі мысалды қарастырыңыз: Листинг 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 жазуға мүмкіндік береді. Келесі кесте қарапайым деректер түрлерін және олардың сәйкес орауыш нысандарын көрсетеді.
Қарапайым типтер Shell сыныптары
логикалық Логикалық
byte Байт
таңба Кейіпкер
жүзу Қалқымалы
int бүтін сан
ұзақ Ұзақ
қысқа Қысқа
1-кесте: Салыстыру операторлары бар қарапайым түрлер және балама орауыш сыныптары 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);
    }
}
Автоматты буып-түюді пайдалану кезінде мыналарды есте ұстаған жөн: Біз білетіндей, әрбір жақсы мүмкіндіктің кемшілігі бар. Автоматты қаптама бұл мәселеде ерекшелік емес. Бұл мүмкіндікті пайдаланған кезде әзірлеуші ​​есте сақтауы керек кейбір маңызды ескертпелер:
  • Нысандарды ' ==' операторымен салыстыру түсініксіз болуы мүмкін, себебі оны қарапайым түрлер мен нысандарға қолдануға болады. Бұл оператор нысандарға қолданылғанда, ол нақты нысандардың өздері емес, нысандарға сілтемелерді салыстырады.
Листинг 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імен салыстырсақ, онда нысан қораптан шығарылады, ол NullPointerExceptionнысанды тастай алады null.
  • Объектіні кэштеу. Әдіс valueOf()кэштейтін қарабайыр нысандардың контейнерін жасайды. Мәндер -128-ден 127-ге дейінгі ауқымда кэштелгендіктен, бұл кэштелген нысандар басқаша әрекет етуі мүмкін.
  • Өнімділіктің төмендеуі. Автобокс немесе қораптан шығару қолданба өнімділігін төмендетеді, себебі ол қоқыс жинағышты жиірек жұмыс істеуге мәжбүр ететін қажетсіз нысан жасайды.
Автобокстың кемшіліктері Автобокстың бірқатар артықшылықтары болса да, оның келесі кемшіліктері бар: 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 нысанына қолдану мүмкін емес. Содан кейін нәтиже автоматты түрде оралады. JDK 1.5 нұсқасына дейін деректер түрлері intмен бүтін сан әртүрлі болды. Әдістің шамадан тыс жүктелуі жағдайында бұл екі түрі еш қиындықсыз пайдаланылды. Автоматты орау/ораудың пайда болуымен бұл қиынырақ болды. Бұған мысал ретінде remove()ішіндегі шамадан тыс жүктелген әдісті келтіруге болады ArrayList. Сыныпта ArrayListекі жою әдісі бар - remove(index)және remove(object). Бұл жағдайда әдісті шамадан тыс жүктеу болмайды және сәйкес әдіс сәйкес параметрлермен шақырылады.

Қорытынды

Автобокс – қарапайым деректер түрлерін сәйкес орауыш сыныптарына (нысандарына) жасырын түрлендіру механизмі. Компилятор valueOf()қарабайыр типтерді нысандарға түрлендіру әдісін, ал an objectінің қарабайыр түрлерін алу үшін әдістерін және т.б. IntValue()пайдаланады . Автобокс логикалық типті логикалық түрге, byteқа, таңбаға, қалқымаға, бүтінге, ұзынға, қысқа түрге doubleValue()түрлендіреді . Қаптаманы шығару кері бағытта жүреді. Түпнұсқа мақалаbooleanbytecharfloatintlongshort
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION