JavaRush /جاوا بلاگ /Random-SD /جاوا ۾ آٽو باڪسنگ ۽ انباڪسنگ
DSergey_Kh
سطح

جاوا ۾ آٽو باڪسنگ ۽ انباڪسنگ

گروپ ۾ شايع ٿيل
هن آرٽيڪل ۾ اسان جاوا ۾ هڪ خاصيت تي نظر ڪنداسين جنهن کي آٽو باڪسنگ / انباڪسنگ سڏيو ويندو آهي . آٽو باڪسنگ ۽ انباڪسنگ ابتدائي قسمن کي اعتراض جي قسمن ۾ تبديل ڪرڻ جو ڪم آهي ۽ ان جي برعڪس. جاوا ۾ آٽو باڪسنگ ۽ انباڪسنگ - 1سڄو عمل خودڪار طريقي سان جاوا رن ٽائيم ماحول (JRE) پاران ڪيو ويندو آهي. پر هن فنڪشن کي لاڳو ڪرڻ وقت توهان کي محتاط هجڻ گهرجي، ڇاڪاڻ ته ... اهو توهان جي پروگرام جي ڪارڪردگي کي متاثر ڪري سگهي ٿو.

تعارف

JDK 1.5 هيٺ ڏنل نسخن ۾، بنيادي ڊيٽا جي قسمن کي تبديل ڪرڻ آسان نه هو ، جهڙوڪ int, char, انهن جي لفافي طبقن ۾ Integer، Character، Float، Double. JDK 5 سان شروع ڪندي، هي ڪارڪردگي، ابتدائي قسمن کي برابر شين ۾ تبديل ڪندي، خودڪار طريقي سان لاڳو ٿئي ٿي. هي ملڪيت آٽو باڪسنگ طور سڃاتو وڃي ٿو . ريورس عمل، ترتيب سان، Unboxing آهي ، يعني. شين کي انهن جي لاڳاپيل ابتدائي قسمن ۾ تبديل ڪرڻ جو عمل. آٽو باڪسنگ ۽ انباڪسنگ لاءِ نمونو ڪوڊ ھيٺ ڏنل آھي: آٽو باڪسنگfloatdouble
Integer integer = 9;
انباڪسنگ
int in = 0;
in = new Integer(9);
جڏهن آٽو پيڪنگ ۽ انپيڪنگ استعمال ڪيو ويندو آهي؟ آٽو باڪسنگ استعمال ڪيو ويندو آھي جاوا ڪمپلر پاران ھيٺ ڏنل شرطن تحت:
  • جڏهن هڪ ابتدائي قسم جو قدر هڪ طريقي سان هڪ طريقي جي پيٽرولر جي طور تي منظور ڪيو ويو آهي، جيڪو ساڳئي لفافي طبقي جي اعتراض جي توقع ڪري ٿو.
  • جڏهن هڪ پرائمري قسم جو قدر لڳايو ويو آهي متغير کي لاڳاپيل لفافي طبقي جي.
ھيٺ ڏنل مثال تي غور ڪريو: لسٽنگ 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 ۽ مٿي ۾ هي ڪوڊ بغير ڪنهن غلطي جي گڏ ڪري ٿو، Integer کي تبديل ڪري ٿو int. Unboxing استعمال ڪيو ويندو آھي جاوا ڪمپلر پاران ھيٺ ڏنل شرطن تحت:
  • جڏهن هڪ اعتراض هڪ طريقي سان پيٽرولر جي طور تي منظور ڪيو ويو آهي جيڪو هڪ لاڳاپيل ابتدائي قسم جي توقع ڪري ٿو.
  • جڏهن هڪ شئي کي مقرر ڪيو ويو آهي متغير سان لاڳاپيل ابتدائي قسم جي.
ھيٺ ڏنل مثال تي غور ڪريو: لسٽنگ 2: سادي ڪوڊ ڏيکاريندي unboxing
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;
}
}
آٽو باڪسنگ ۽ انباڪسنگ ڊولپر کي ڪوڊ لکڻ جي اجازت ڏئي ٿي جيڪا پڙهڻ ۽ سمجھڻ ۾ آسان آهي. هيٺ ڏنل جدول ڏيکاري ٿو ابتدائي ڊيٽا جي قسمن ۽ انهن سان لاڳاپيل لفافي شيون.
ابتدائي قسمون شيل ڪلاس
بولين بوليان
بائيٽ بائيٽ
چار ڪردار
فلوٽ فلوٽ
int عدد
ڊگهو ڊگھو
مختصر ننڍو
جدول 1: مقابلي واري آپريٽرن سان پرائمٽيو قسم ۽ برابري واري ريپر ڪلاس آٽو باڪسنگ ۽ انباڪسنگ استعمال ڪري سگھجن ٿيون موازن آپريٽرن سان. هيٺ ڏنل ڪوڊ اسپيٽ بيان ڪري ٿو ته اهو ڪيئن ٿئي ٿو: لسٽنگ 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
  • توسيع دليلن جي variable تعداد کي مات ڏئي ٿو هڪ اهڙي صورتحال ۾ جتي اها توسيع ۽ دلائل جي متغير تعداد جي وچ ۾ چونڊ ٿي وڃي، توسيع ترجيح آهي.
لسٽنگ 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);
   }
  }
  • Packing beats variable number of arguments هڪ اهڙي صورتحال ۾ جتي اهو پيڪنگ ۽ دلائل جي variable تعداد جي وچ ۾ چونڊ ٿي وڃي، پيڪنگ کي ترجيح ڏني وڃي ٿي.
لسٽنگ 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);
    }
}
آٽو پيڪنگ استعمال ڪرڻ وقت توھان کي ھيٺين ڳالھين کي ذهن ۾ رکڻ گھرجي: جيئن اسان ڄاڻون ٿا، ھر سٺي خصوصيت ۾ ڪو نقص ھوندو آھي. خودڪار پيڪنگنگ هن سلسلي ۾ ڪو به استثنا نه آهي. ڪجهه اهم نوٽس ته هڪ ڊولپر کي ذهن ۾ رکڻ گهرجي جڏهن هن خاصيت کي استعمال ڪندي:
  • شين جو مقابلو '' آپريٽر سان ڪرڻ ==مونجهارو ٿي سگهي ٿو، ڇاڪاڻ ته اهو استعمال ڪري سگهجي ٿو ابتدائي قسمن ۽ شين تي. جڏهن هي آپريٽر شيون تي لاڳو ڪيو ويندو آهي، اهو اصل ۾ حوالن جي شين جو مقابلو ڪري ٿو، نه پاڻ کي شيون.
لسٽنگ 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");
      }
   }
}
  • برابري ۽ لاڳاپي آپريٽرز سان شيون ۽ ابتدائي قسمن کي گڏ ڪرڻ. جيڪڏهن اسان هڪ ابتدائي قسم جو ڪنهن شئي سان ڀيٽ ڪريون ٿا ته پوءِ اهو اعتراض اڻ باڪس ٿيل آهي، جيڪو اڇلائي سگهي ٿو NullPointerExceptionجيڪڏهن اعتراض null.
  • اعتراض ڪيشنگ. اهو طريقو valueOf()بنيادي شين جو هڪ ڪنٽينر ٺاهي ٿو جيڪو اهو ڪيش ڪري ٿو. ڇاڪاڻ ته قيمتون -128 کان 127 جي حد ۾ ڪيش ٿيل آهن، شامل آهن، اهي ڪيش ڪيل شيون مختلف طريقي سان ڪم ڪري سگهن ٿيون.
  • ڪارڪردگي جي خرابي. آٽو باڪسنگ يا انباڪسنگ ايپليڪيشن جي ڪارڪردگي کي خراب ڪري ٿي ڇاڪاڻ ته اهو هڪ ناپسنديده اعتراض پيدا ڪري ٿو جيڪو ڪچري جي جمع ڪندڙ کي وڌيڪ بار هلائڻ تي مجبور ڪري ٿو.
آٽو باڪسنگ جا نقصان جيتوڻيڪ آٽو باڪسنگ جا ڪيترائي فائدا آھن، ان جا ھيٺيان نقصان آھن: لسٽنگ 8: نموني ڪوڊ ڏيکاريندڙ ڪارڪردگي جو مسئلو.
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 انباڪسنگ شروع ڪري ٿي ڇو ته ' +' آپريٽر انٽيجر اعتراض تي لاڳو نه ٿو ڪري سگھجي. ۽ پوء نتيجو خودڪار ٿيل آهي واپس. JDK 1.5 کان اڳ، ڊيٽا جا قسم int۽ Integer مختلف هئا. طريقي جي اوور لوڊ ڪرڻ جي صورت ۾، اهي ٻه قسم بغير ڪنهن مسئلن جي استعمال ڪيا ويا. خودڪار پيڪنگ / پيڪنگ جي آمد سان، اهو وڌيڪ ڏکيو ٿي چڪو آهي. هن جو هڪ مثال آهي اوور لوڊ ٿيل remove()طريقو ArrayList. ڪلاس ArrayList۾ ٻه حذف طريقا آهن - remove(index)۽ remove(object). انهي صورت ۾، طريقو اوورلوڊنگ نه ٿيندو ۽ لاڳاپيل طريقو مناسب پيٽرولر سان سڏيو ويندو.

نتيجو

آٽو باڪسنگ بنيادي ڊيٽا جي قسمن کي لاڳاپيل لفافي طبقن (آبجڪس) ۾ واضح طور تي تبديل ڪرڻ لاءِ هڪ ميکانيزم آهي. گڏ ڪرڻ وارو طريقو استعمال ڪري ٿو valueOf()ابتدائي قسمن کي شين ۾ تبديل ڪرڻ لاءِ، ۽ طريقن وغيره کي IntValue()، doubleValue()اعتراض جي ابتدائي قسمن کي حاصل ڪرڻ لاءِ. آٽو باڪسنگ بولين جي قسم کي بدلائي ٿو booleanبولين ۾، byteبائيٽ ۾، charڪردار ۾، floatفلوٽ ۾، intانٽيجر ۾، longڊگھي ۾، shortمختصر ۾. Unpacking ريورس هدايت ۾ ٿئي ٿي. اصل مضمون
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION