JavaRush /جاوا بلاگ /Random-SD /ڍڪڻ، لفافي ڪرڻ ۽ پيڪنگ

ڍڪڻ، لفافي ڪرڻ ۽ پيڪنگ

گروپ ۾ شايع ٿيل
سلام! توھان اڳ ۾ ئي ابتدائي قسمن سان واقف آھيو، ۽ انھن سان گھڻو ڪم ڪيو آھي. لفافي، لفافي ۽ پيڪنگ - 1پروگرامنگ ۾ پرائمري، ۽ خاص طور تي جاوا ۾، ڪيترائي فائدا آھن: اھي ٿوري ميموري وٺندا آھن، اھڙيءَ طرح پروگرام جي ڪارڪردگيءَ کي وڌائيندا آھن، ۽ واضح طور تي قدرن جي حدن ۾ ورهايل آھن. تنهن هوندي، جاوا سکڻ جي عمل ۾، اسان هڪ کان وڌيڪ ڀيرا ورجايو آهي، هڪ منتر وانگر، " جاوا ۾ هر شيء هڪ اعتراض آهي ." پر primitives انهن لفظن جي سڌي رد آهي. اهي شيون نه آهن. پوء اهو اصول "هر شيء هڪ اعتراض آهي" غلط آهي؟ سچي نه. جاوا ۾، هر ابتدائي قسم کي ان جا ٻه ڀائر آهن، ريپر ڪلاس ( Wrapper). هڪ چادر ڇا آهي؟ هڪ لفافي هڪ خاص طبقو آهي جيڪو پنهنجي اندر هڪ ابتدائي جي قيمت کي ذخيرو ڪري ٿو. پر جيئن ته هي هڪ طبقو آهي، اهو پنهنجو مثال ٺاهي سگهي ٿو. اهي اصل شيون هجڻ دوران، اندر ضروري ابتدائي قدرن کي ذخيرو ڪندا. لفافي طبقن جا نالا ساڳيا پرائمري جي نالن سان ملندڙ جلندڙ آهن، يا مڪمل طور تي انهن سان ٺهڪندڙ آهن. تنهن ڪري، ان کي ياد ڪرڻ لاء تمام آسان ٿيندو.
پرائمري ڊيٽا جي قسمن لاء ريپر ڪلاس
پرائمري ڊيٽا جا قسم ريپر ڪلاس
int عدد
مختصر ننڍو
ڊگهو ڊگھو
بائيٽ بائيٽ
فلوٽ فلوٽ
ٻيڻو ٻيڻو
چار ڪردار
بولين بوليان
ريپر ڪلاس جون شيون ٺاهيون ويون آهن ڪنهن ٻئي وانگر:
public static void main(String[] args) {

   Integer i = new Integer(682);

   Double d = new Double(2.33);

   Boolean b = new Boolean(false);
}
ريپر ڪلاس توهان کي نقصانات کي گهٽائڻ جي اجازت ڏين ٿا جيڪي ابتدائي قسمون آهن. سڀ کان وڌيڪ پڌرو اهو آهي ته ابتدائي ماڻهن وٽ طريقا نه هوندا آهن . مثال طور، انهن وٽ ڪو طريقو ناهي toString()، تنهنڪري توهان نٿا ڪري سگهو، مثال طور، هڪ نمبر کي intاسٽرنگ ۾ تبديل ڪريو. پر هڪ لفافي طبقي سان Integerاهو آسان آهي.
public static void main(String[] args) {

   Integer i = new Integer(432);

   String s = i.toString();
}
ريورس ٽرانسفارميشن سان به مشڪلاتون هونديون. اچو ته چئون ته اسان وٽ هڪ تار آهي جنهن کي اسان ڄاڻون ٿا پڪ سان هڪ نمبر تي مشتمل آهي. جڏهن ته، هڪ ابتدائي قسم جي صورت ۾، intاسان هن نمبر کي اسٽرنگ مان حاصل ڪرڻ جي قابل نه هوندا ۽ ان کي، حقيقت ۾، هڪ عدد ۾ ڦيرايو. پر لفافي طبقن جي مهرباني، اسان وٽ هاڻي اهو موقعو آهي.
public static void main(String[] args) {

   String s = "1166628";

   Integer i = Integer.parseInt(s);

   System.out.println(i);
}
ٻاھر نڪتو: 1166628 اسان ڪاميابيءَ سان ھڪڙي نمبر کي ھڪڙي اسٽرنگ مان حاصل ڪيو آھي ۽ ان کي ھڪڙي ريفرنس ويريبل ڏانھن لڳايو آھي Integer i. رستي جي ذريعي، لنڪ بابت. توهان اڳ ۾ ئي ڄاڻو ٿا ته پيٽرولر مختلف طريقن سان طريقن سان گذري ويا آهن: پرائمري قدر طرفان گذري ويا آهن، ۽ شيون حوالن سان گذري ويا آهن. توھان ھن علم کي استعمال ڪري سگھو ٿا جڏھن توھان جا طريقا ٺاھيو: جيڪڏھن توھان جو طريقو ڪم ڪري ٿو، مثال طور، جزوي انگن سان، پر توھان کي ضرورت آھي منطق جي حوالي سان، توھان پاس ڪري سگھوٿا طريقه ڪار جي Double/Floatبدران double/float. ان کان علاوه، طريقن جي اضافي ۾، لفافي طبقن ۾ جامد فيلڊ آهن جيڪي استعمال ڪرڻ لاء تمام آسان آهن. مثال طور، تصور ڪريو ته توھان ھاڻي ھڪڙي ڪم سان منهن ڪيو آھي: پرنٽ ڪريو وڌ ۾ وڌ ممڪن نمبر ڪنسول ڏانھن int، ۽ پوء گھٽ ۾ گھٽ ممڪن نمبر. اهو ڪم ابتدائي لڳي ٿو، پر اڃا تائين، توهان گوگل کان سواءِ مشڪل سان ڪري سگهندا. ۽ ريپر ڪلاس آساني سان توهان کي هيٺ ڏنل ”روزمره جي مسئلن“ کي حل ڪرڻ جي اجازت ڏين ٿا:
public class Main {
   public static void main(String[] args) {

       System.out.println(Integer.MAX_VALUE);
       System.out.println(Integer.MIN_VALUE);
   }
}
اهڙا شعبا توهان کي وڌيڪ سنجيده ڪمن کان پريشان نه ٿيڻ جي اجازت ڏين ٿا. ان حقيقت جو ذڪر نه ڪرڻ گهرجي ته نمبر 2147483647 ڇپائي جي عمل ۾ (اهو بلڪل MAX_VALUE آهي) ان کي غلط ٽائيپ ڪرڻ ڪو به تعجب جي ڳالهه ناهي :) ان کان علاوه، اڳئين ليڪچرن مان هڪ ۾ اسان اڳ ۾ ئي ان حقيقت ڏانهن ڌيان ڇڪايو آهي ته ريپر ڪلاس جون شيون. ناقابل بدل آهن .
public static void main(String[] args) {

   Integer a = new Integer(0);
   Integer b = new Integer(0);

   b = a;
   a = 1;
   System.out.println(b);
}
ٻاھر نڪرندڙ: 0 اھو اعتراض جنھن جو حوالو اصل ۾ اشارو ڪيو ويو آھي аان جي حالت تبديل نه ڪئي آھي، ٻي صورت ۾ قدر bپڻ تبديل ٿي ھا. جيئن ته String، ريپر اعتراض جي حالت کي تبديل ڪرڻ جي بدران، هڪ مڪمل طور تي نئين شئي ياداشت ۾ ٺاهي وئي آهي. جاوا جي تخليقڪارن آخر فيصلو ڪيو ته ٻوليءَ ۾ ابتدائي قسمون رکيون وڃن؟ جيئن ته هر شي کي هڪ اعتراض هجڻ گهرجي، ۽ اسان وٽ اڳ ۾ ئي لفافي ڪلاس موجود آهن جيڪي هر شيء کي ظاهر ڪرڻ لاء استعمال ڪري سگهجن ٿيون جيڪي ابتدائي بيان ڪن ٿا، ڇو نه صرف انهن کي ٻوليء ۾ ڇڏي ڏيو ۽ پرائمري کي هٽايو؟ جواب سادو آهي - ڪارڪردگي. Primitive قسمن کي primitive چئبو آهي ڇاڪاڻ ته اهي شيون جي ڪيترن ئي ”ڀان“ خاصيتن کان خالي آهن. ها، هڪ اعتراض ڪيترائي آسان طريقا آهن، پر توهان کي هميشه انهن جي ضرورت ناهي. ڪڏهن ڪڏهن توهان کي صرف نمبر 33، يا 2.62، يا قيمت جي ضرورت آهي true/ false. اهڙين حالتن ۾ جتي شيون جا سڀئي فائدا اهم نه آهن ۽ پروگرام جي ڪم ڪرڻ جي ضرورت نه آهي، پرائمري هڪ تمام بهتر ڪم ڪندو.

خودڪار پيڪنگ/آٽو-پيڪنگ

جاوا ۾ پريميٽوز ۽ انهن جي لفافي طبقن جي خاصيتن مان هڪ آهي آٽو باڪسنگ/آٽو باڪسنگ. لفافي، لڪائڻ ۽ پيڪنگ - 2 اچو ته ان تصور کي سمجھون. جيئن ته توهان ۽ مون اڳ ۾ ئي سکيو آهي، جاوا هڪ اعتراض تي مبني ٻولي آهي. هن جو مطلب آهي ته جاوا ۾ لکيل سڀئي پروگرام شيون ٺهيل آهن. Primitives شيون نه آهن. بهرحال، لفافي طبقي جي متغير کي هڪ ابتدائي قسم جي قيمت مقرر ڪري سگهجي ٿو. هن عمل کي autoboxing سڏيو ويندو آهي . ساڳيءَ طرح، هڪ پرائمٽيو قسم جي هڪ متغير کي لفافي طبقي جو هڪ اعتراض مقرر ڪري سگهجي ٿو. هن عمل کي autounboxing سڏيو ويندو آهي . مثال طور:
public class Main {
   public static void main(String[] args) {
       int x = 7;
       Integer y = 111;
       x = y; // auto unpacking
       y = x * 123; // autopacking
   }
}
لائن 5 تي، اسان primitive x کي y جي قيمت ڏيون ٿا، جيڪو ريپر ڪلاس جو ھڪڙو اعتراض آھي Integer. جئين توهان ڏسي سگهو ٿا، هن لاء اضافي ڪمن جي ضرورت ناهي: مرتب ڪندڙ اهو ڄاڻي ٿو int۽ Integerحقيقت ۾، ساڳئي شيء . هي خودڪار unpacking آهي. ساڳي شيء لائن 6 ۾ آٽو باڪسنگ سان ٿئي ٿي: اعتراض y آساني سان مقرر ڪيل قدر جي قيمت (x * 123). هي آٽو پيڪنگ جو هڪ مثال آهي. اهو ئي سبب آهي ته لفظ "خودڪار" شامل ڪيو ويو آهي: انهن جي لفافي طبقن جي شين جي ابتدائي حوالن کي تفويض ڪرڻ لاء (۽ ان جي برعڪس) توهان کي ڪجهه ڪرڻ جي ضرورت ناهي، سڀ ڪجهه خودڪار ٿئي ٿو . آسان، صحيح؟ :) آٽو-پيڪنگ/آٽو-انپيڪنگ جي هڪ ٻي تمام وڏي سهولت طريقن جي آپريشن ۾ ظاهر ٿئي ٿي. حقيقت اها آهي ته طريقو پيٽرولر پڻ خودڪار پيڪنگنگ ۽ خودڪار پيڪنگنگ جي تابع آهن . ۽، مثال طور، جيڪڏهن انهن مان هڪ ٻن شين کي انپٽ طور وٺي Integer، اسان آسانيءَ سان اتي عام پريميٽيو پاس ڪري سگهون ٿا int!
public class Main {
   public static void main(String[] args) {

       printNumber(7);//regular int, even without a variable
   }

   public static void printNumber(Integer i) {
       System.out.println("You entered a number" + i);
   }
}
ٻاھر نڪتو: توھان داخل ڪيو نمبر 7. اھو ٻئي طريقي سان ڪم ڪري ٿو:
public class Main {
   public static void main(String[] args) {

       printNumber(new Integer(632));
   }

   public static void printNumber(int i) {
       System.out.println("You entered a number" + i);
   }
}
ياد رکڻ لاءِ هڪ اهم نقطو: آٽو باڪسنگ ۽ انباڪسنگ صفن لاءِ ڪم نٿو ڪري !
public class Main {
   public static void main(String[] args) {

       int[] i = {1,2,3,4,5};

       printArray(i);//error, won't compile!
   }

   public static void printArray(Integer[] arr) {
       System.out.println(Arrays.toString(arr));
   }
}
primitives جي ھڪڙي ھڪڙي طريقي کي ھڪڙي طريقي سان منتقل ڪرڻ جي ڪوشش ڪري ٿو جيڪو شيون جي ھڪڙي صف کي ان پٽ جي طور تي وٺي ٿو ھڪڙي ترتيب جي غلطي جو سبب بڻجندو. آخرڪار، اچو ته هڪ ڀيرو ٻيهر مختصر طور تي موازنہ ڪريون پرائمري ۽ ريپرس Primitives:
  • ڪارڪردگي جو فائدو آهي
ڪپڙا:
  • اهي توهان کي اجازت ڏين ٿا ته "هر شيء هڪ اعتراض آهي" جي اصول جي ڀڃڪڙي نه ڪريو، انهي ڪري ته انگ، علامت ۽ بولين قدر صحيح / غلط هن تصور کان ٻاهر نه نڪرندا آهن.
  • آسان طريقن ۽ شعبن کي مهيا ڪندي انهن قدرن سان ڪم ڪرڻ جي صلاحيت کي وڌايو
  • ضروري آهي جڏهن ڪجهه طريقو خاص طور تي شين سان ڪم ڪري سگهي ٿو
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION