JavaRush /Блоги Java /Random-TG /Автобокс ва кушодан дар Java
DSergey_Kh
Сатҳи

Автобокс ва кушодан дар Java

Дар гурӯҳ нашр шудааст
Дар ин мақола мо хусусиятеро дар Java дида мебароем, ки бо номи autoboxing/unboxing . Autoboxing ва unboxing вазифаи табдил додани намудҳои ибтидоӣ ба намудҳои an object ва баръакс мебошад. Автобокс ва кушодан дар Java - 1Тамоми раванд ба таври худкор аз ҷониби Java Runtime Environment (JRE) иҷро карда мешавад. Аммо ҳангоми татбиқи ин функсия шумо бояд эҳтиёт бошед, зеро... Он метавонад ба иҷрои барномаи шумо таъсир расонад.

Муқаддима

intДар versionҳои поёнии JDK 1.5 табдил додани намудҳои ибтидоии додаҳо ба монанди , char, float, doubleба синфҳои сарпӯши онҳо Integer, Character, Float, Double осон набуд . Аз JDK 5 сар карда, ин функсия, табдил додани намудҳои ибтидоӣ ба an objectҳои баробар, ба таври худкор амалӣ карда мешавад. Ин амвол бо номи Autoboxing маълум аст . Раванди баръакс, мутаносибан, Unboxing , яъне. раванди табдил додани an objectҳо ба навъҳои ибтидоии онҳо. Рамзи намунавӣ барои autoboxing ва unboxing дар зер оварда шудааст: Autoboxing
Integer integer = 9;
Кушодани қуттӣ
int in = 0;
in = new Integer(9);
Бастабандии худкор ва кушодан кай истифода мешавад? Autoboxing аз ҷониби компилятори Java дар шароити зерин истифода мешавад:
  • Вақте ки арзиши навъи ибтидоӣ ба усул ҳамчун параметри усул интиқол дода мешавад, ки an objectи синфи мувофиқро интизор аст.
  • Вақте ки арзиши навъи ибтидоӣ ба тағирёбандаи синфи печи мувофиқ таъин карда мешавад.
Мисоли зеринро дида бароед: Рӯйхати 1: Рамзи оддӣ, ки автобоксро нишон медиҳад
public int sumEvenNumbers(List<Integer> intList ) {
int sum = 0;
for (Integer i: intList )
if ( i % 2 == 0 )
sum += i;
return sum;
}
Пеш аз jdk 1.5, рамзи дар боло овардашуда боиси хатогиҳои компиляция мешуд, зеро оператори боқимондаи % ва unary plus += ба синфи печанда татбиқ карда намешавад. Аммо дар jdk 1.5 ва болотар ин code бе хато тартиб дода, бутунро ба int. Unboxing аз ҷониби компилятори Java дар шароити зерин истифода мешавад:
  • Вақте ки an object ҳамчун параметр ба усуле интиқол дода мешавад, ки намуди ибтидоии мувофиқро интизор аст.
  • Вақте ки an object ба тағирёбандаи навъи ибтидоии мувофиқ таъин карда мешавад.
Мисоли зеринро дида бароед: Рӯйхати 2: Рамзи оддӣ, ки кушодани қуттиро нишон медиҳад
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еро нависад, ки хондан ва фаҳмидан осон аст. Дар ҷадвали зерин намудҳои маълумотҳои ибтидоӣ ва an objectҳои сарпӯши мувофиқи онҳо нишон дода шудаанд.
Навъҳои ибтидоӣ Синфҳои Shell
булӣ Булӣ
byte Байт
char Характер
шино кардан шино кардан
int Бутун
дароз дароз
кӯтоҳ Кӯтоҳ
Љадвали 1: Намудњои ибтидої ва синфњои печонидани муодor бо операторњои муќоиса Autoboxing ва unboxing метавонанд бо операторњои муќоиса истифода шаванд. Парчами codeи зерин нишон медиҳад, ки ин чӣ гуна рух медиҳад: Рӯйхати 3: Рамзи намунавӣ, ки бо оператори муқоисавӣ автоматӣ ва кушодани қуттиҳоро нишон медиҳад
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: Рамзи намунавӣ, ки манфиати изофабориро нишон медиҳад
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: Рамзи намунавӣ, ки манфиати изофабориро нишон медиҳад
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: Рамзи намунавӣ, ки манфиати изофабориро нишон медиҳад
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, шумо бояд чизҳои зеринро дар хотир нигоҳ доред: Тавре ки мо медонем, ҳар як хусусияти хуб як нуқсон дорад. Бастабандии автомобилӣ дар ин маврид истисно нест. Баъзе ёддоштҳои муҳиме, ки таҳиягар ҳангоми истифодаи ин хусусият бояд дар хотир дошта бошад:
  • Муқоисаи an objectҳо бо ==оператори ' ' метавонад печида бошад, зеро он метавонад ба намудҳо ва an objectҳои ибтидоӣ татбиқ карда шавад. Вақте ки ин оператор ба an objectҳо истифода мешавад, он воқеан истинодҳоро ба an objectҳо муқоиса мекунад, на худи an objectҳо.
Рӯйхати 7: Рамзи намунавӣ, ки муқоисаро нишон медиҳад.
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 муқоиса кунем, он гоҳ an object қутти нест, ки метавонад партояд, NullPointerExceptionагар an objectи null.
  • Кэшкунии an object. Ин усул valueOf()як контейнери an objectҳои ибтидоиро эҷод мекунад, ки онро кэш мекунад. Азбаски арзишҳо дар диапазони -128 то 127, аз ҷумла, кэш карда мешаванд, ин an objectҳои кэшшуда метавонанд ба таври дигар рафтор кунанд.
  • Пастшавии самаранокӣ. Autoboxing ё unboxing кори барномаро паст мекунад, зеро он an objectи номатлуберо эҷод мекунад, ки коллектори ахлотро маҷбур мекунад, ки зуд-зуд кор кунад.
Камбудиҳои AutoBoxing Гарчанде ки AutoBoxing як қатор афзалиятҳо дорад, он камбудиҳои зерин дорад: Рӯйхати 8: Рамзи намунавӣ, ки масъалаи иҷроишро нишон медиҳад.
public int sumEvenNumbers(List intList) {
          int sum = 0;
          for (Integer i : intList) {
              if (i % 2 == 0) {
                  sum += i;
              }
          }
         return sum;
   }
Дар ин фасли code sum +=i он ба васеъ карда мешавад sum = sum + i. Аз +оператори ' ' сар карда, JVM кушоданро оғоз мекунад, зеро +оператори ' ' ба an objectи Integer татбиқ карда намешавад. Ва он гоҳ натиҷа ба таври худкор бозпас гирифта мешавад. Пеш аз JDK 1.5, намудҳои додаҳо intва Integer гуногун буданд. Дар сурати аз ҳад зиёди усул, ин ду намуд бе мушкилот истифода мешуданд. Бо пайдоиши бастабандии автоматӣ / кушодан, ин мушкилтар шуд. Мисоли ин усули изофабор remove()дар ArrayList. Синф ArrayListду усули нест кардан дорад - remove(index)ва remove(object). Дар ин ҳолат, изофабории усул ба амал намеояд ва усули мувофиқ бо параметрҳои мувофиқ даъват карда мешавад.

Хулоса

Autoboxing як механизми ба таври ғайримустақим табдил додани намудҳои ибтидоии додаҳо ба синфҳои (an objectҳои) мувофиқи бастабандӣ мебошад. Тартибдиҳанда усули valueOf()табдил додани намудҳои ибтидоиро ба an objectҳо ва усулҳои IntValue(), doubleValue()ва ғайраро барои ба даст овардани намудҳои ибтидоии an object истифода мебарад. Autoboxing намуди логикиро booleanба мантиқӣ, byteба byte, charба аломат, floatба шинокунанда, ба intбутун, longдароз, shortба кӯтоҳ табдил медиҳад. Кушодан дар самти баръакс сурат мегирад. Мақолаи аслӣ
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION