JavaRush /جاوا بلاگ /Random-UR /سرفہرست 50 جاوا کور انٹرویو کے سوالات اور جوابات۔ حصہ 1

سرفہرست 50 جاوا کور انٹرویو کے سوالات اور جوابات۔ حصہ 1

گروپ میں شائع ہوا۔
سب کو ہیلو، خواتین و حضرات سافٹ ویئر انجینئرز! آئیے انٹرویو کے سوالات کے بارے میں بات کرتے ہیں۔ آپ کو کس چیز کی تیاری کرنی ہے اور آپ کو کیا جاننے کی ضرورت ہے۔ ان نکات کو شروع سے دہرانے یا ان کا مطالعہ کرنے کی یہ ایک بہترین وجہ ہے۔ سرفہرست 50 جاوا کور انٹرویو کے سوالات اور جوابات۔  حصہ 1 - 1میرے پاس OOP، Java Syntax، جاوا میں مستثنیات، کلیکشنز اور ملٹی تھریڈنگ کے بارے میں اکثر پوچھے گئے سوالات کا کافی وسیع ذخیرہ ہے، جسے میں سہولت کے لیے کئی حصوں میں تقسیم کروں گا۔ اہم:ہم صرف 8 تک کے جاوا ورژنز کے بارے میں بات کریں گے۔ یہاں 9، 10، 11، 12، 13 کی تمام اختراعات کو مدنظر نہیں رکھا جائے گا۔ جوابات کو بہتر بنانے کے طریقے کے بارے میں کوئی بھی خیالات/تبصرے خوش آئند ہیں ۔ خوش پڑھنا، چلو!

جاوا انٹرویو: OOP سوالات

1. جاوا میں کیا خصوصیات ہیں؟

جواب:
  1. OOP تصورات:

    1. آبجیکٹ واقفیت؛
    2. وراثت؛
    3. encapsulation
    4. پولیمورفزم
    5. تجری.
  2. کراس پلیٹ فارم: جاوا پروگرام کسی بھی پلیٹ فارم پر بغیر کسی ترمیم کے چلایا جا سکتا ہے۔ صرف ایک چیز جس کی آپ کو ضرورت ہے وہ ایک انسٹال شدہ JVM (جاوا ورچوئل مشین) ہے۔

  3. اعلی کارکردگی: جے آئی ٹی (جسٹ ان ٹائم کمپائلر) اعلی کارکردگی کی اجازت دیتا ہے۔ جے آئی ٹی بائٹ کوڈ کو مشین کوڈ میں تبدیل کرتی ہے اور پھر جے وی ایم عمل درآمد شروع کرتا ہے۔

  4. ملٹی تھریڈنگ: عملدرآمد کا ایک دھاگہ جسے کہا جاتا ہے Thread۔ JVM نامی ایک دھاگہ بناتا ہے main thread۔ ایک پروگرامر تھریڈ کلاس سے وراثت میں یا انٹرفیس کو لاگو کرکے متعدد تھریڈز بنا سکتا ہے Runnable۔

2. وراثت کیا ہے؟

وراثت کا مطلب یہ ہے کہ ایک طبقہ دوسرے طبقے کو وراثت میں لے سکتا ہے (" توسیع ")۔ اس طرح آپ اس کلاس کا کوڈ دوبارہ استعمال کر سکتے ہیں جس سے آپ کو وراثت ملی ہے۔ موجودہ کلاس کے نام سے جانا جاتا ہے superclass، اور جو تخلیق کیا جا رہا ہے اسے کہا جاتا ہے subclass۔ وہ یہ بھی کہتے ہیں parentاور child.
public class Animal {
   private int age;
}

public class Dog extends Animal {

}
کہاں Animalہے parent، اور Dog-child

3. encapsulation کیا ہے؟

یہ سوال اکثر جاوا ڈویلپر انٹرویوز کے دوران سامنے آتا ہے۔ Encapsulation ایکسیس موڈیفائر کا استعمال کرتے ہوئے، گیٹرز اور سیٹرز کا استعمال کرتے ہوئے نفاذ کو چھپا رہا ہے۔ یہ ان جگہوں پر بیرونی استعمال کے لیے رسائی کو بند کرنے کے لیے کیا جاتا ہے جہاں ڈویلپرز ضروری سمجھتے ہیں۔ زندگی سے قابل رسائی مثال ایک کار ہے۔ ہمارے پاس انجن کے آپریشن تک براہ راست رسائی نہیں ہے۔ ہمارے لیے، کام اگنیشن میں چابی لگانا اور انجن کو آن کرنا ہے۔ اور ہڈ کے نیچے کیا عمل ہوگا یہ ہمارے کاروبار میں سے کوئی نہیں ہے۔ مزید یہ کہ اس سرگرمی میں ہماری مداخلت غیر متوقع صورت حال کو جنم دے سکتی ہے جس کی وجہ سے ہم گاڑی کو توڑ سکتے ہیں اور خود کو نقصان پہنچا سکتے ہیں۔ پروگرامنگ میں بالکل ایسا ہی ہوتا ہے۔ ویکیپیڈیا پر اچھی طرح سے بیان کیا گیا ہے ۔ JavaRush پر encapsulation کے بارے میں ایک مضمون بھی ہے ۔

4. پولیمورفزم کیا ہے؟

پولیمورفزم ایک پروگرام کی قابلیت ہے کہ وہ ایک ہی انٹرفیس کے ساتھ اشیاء کو اس چیز کی مخصوص قسم کے بارے میں معلومات کے بغیر استعمال کرے۔ جیسا کہ وہ کہتے ہیں، ایک انٹرفیس - بہت سے نفاذ. پولیمورفزم کے ساتھ، آپ مختلف قسم کی اشیاء کو ان کے عام رویے کی بنیاد پر جوڑ کر استعمال کر سکتے ہیں۔ مثال کے طور پر، ہمارے پاس ایک کلاس اینیمل ہے، جس کی دو اولادیں ہیں - کتا اور بلی۔ عام جانوروں کی کلاس میں سب کے لیے ایک عام رویہ ہے - آواز نکالیں۔ ایسی صورت میں جب ہمیں جانوروں کے طبقے کی تمام اولادوں کو اکٹھا کرنے اور "ساؤنڈ بنائیں" کے طریقہ کار پر عمل درآمد کرنے کی ضرورت ہو، ہم پولیمورفزم کے امکانات کو استعمال کرتے ہیں۔ یہ ایسا نظر آئے گا:
List<Animal> animals = Arrays.asList(new Cat(), new Dog(), new Cat());
animals.forEach(animal -> animal.makeSound());
تو پولیمورفزم ہماری مدد کرتا ہے۔ مزید یہ کہ یہ پولیمورفک (اوور لوڈڈ) طریقوں پر بھی لاگو ہوتا ہے۔ پولیمورفزم کے استعمال کی مشق

انٹرویو کے سوالات - جاوا نحو

5. جاوا میں کنسٹرکٹر کیا ہے؟

درج ذیل خصوصیات درست ہیں:
  1. جب کوئی نیا آبجیکٹ بنایا جاتا ہے، تو پروگرام ایسا کرنے کے لیے مناسب کنسٹرکٹر کا استعمال کرتا ہے۔
  2. کنسٹرکٹر ایک طریقہ کی طرح ہے۔ اس کی خاصیت یہ ہے کہ کوئی لوٹنے والا عنصر نہیں ہے (بشمول باطل)، اور اس کا نام کلاس کے نام جیسا ہی ہے۔
  3. اگر کوئی کنسٹرکٹر واضح طور پر نہیں لکھا جاتا ہے، تو ایک خالی کنسٹرکٹر خود بخود بن جائے گا۔
  4. کنسٹرکٹر کو اوور رائڈ کیا جا سکتا ہے۔
  5. اگر پیرامیٹرز کے ساتھ کنسٹرکٹر بنایا گیا تھا، لیکن پیرامیٹر کے بغیر بھی اس کی ضرورت ہے، تو اسے الگ سے لکھا جانا چاہیے، کیونکہ یہ خود بخود نہیں بنتا ہے۔

6. کون سی دو کلاسیں آبجیکٹ سے وراثت میں نہیں آتی ہیں؟

اشتعال انگیزیوں سے بیوقوف نہ بنیں، ایسی کوئی کلاسیں نہیں ہیں: تمام کلاسیں براہ راست یا آبجیکٹ کلاس سے وراثت میں ملی ہیں!

7. مقامی متغیر کیا ہے؟

جاوا ڈویلپر انٹرویو کے دوران ایک اور مقبول سوال۔ ایک مقامی متغیر ایک متغیر ہے جو ایک طریقہ کے اندر بیان کیا جاتا ہے اور اس وقت تک موجود رہتا ہے جب تک کہ طریقہ کار پر عمل درآمد نہ ہو۔ ایک بار عملدرآمد ختم ہونے کے بعد، مقامی متغیر کا وجود ختم ہو جائے گا۔ یہ ایک پروگرام ہے جو مین() طریقہ میں ہیلو میسیج لوکل متغیر کا استعمال کرتا ہے۔
public static void main(String[] args) {
   String helloMessage;
   helloMessage = "Hello, World!";
   System.out.println(helloMessage);
}

8. مثال متغیر کیا ہے؟

مثال متغیر ایک متغیر ہے جو کلاس کے اندر بیان کیا جاتا ہے، اور یہ اس وقت تک موجود رہتا ہے جب تک کہ آبجیکٹ موجود نہ ہو۔ ایک مثال مکھی کی کلاس ہے، جس میں دو متغیرات ہیں nectarCapacity اور maxNectarCapacity:
public class Bee {

   /**
    * Current nectar capacity
    */
   private double nectarCapacity;

   /**
    * Maximal nectar that can take bee.
    */
   private double maxNectarCapacity = 20.0;

  ...
}

9. رسائی میں ترمیم کرنے والے کیا ہیں؟

رسائی موڈیفائر ایک ایسا ٹول ہے جو آپ کو کلاسز، طریقوں اور متغیرات تک رسائی کو اپنی مرضی کے مطابق کرنے کی اجازت دیتا ہے۔ رسائی بڑھانے کے لیے ترتیب دیے گئے درج ذیل ترمیم کار ہیں:
  1. private- طریقوں، فیلڈز اور کنسٹرکٹرز کے لیے استعمال کیا جاتا ہے۔ رسائی کی سطح صرف وہ کلاس ہے جس کے اندر اس کا اعلان کیا گیا ہے۔
  2. package-private(default)- کلاسز کے لیے استعمال کیا جا سکتا ہے۔ صرف ایک مخصوص پیکج میں رسائی جس میں کلاس، طریقہ، متغیر، کنسٹرکٹر کا اعلان کیا جاتا ہے۔
  3. protected- ان کلاسوں کے لیے + جیسی رسائی package-privateجو ترمیم کنندہ کے ساتھ کلاس سے وراثت میں ملتی ہے protected۔
  4. public- کلاسوں کے لیے بھی استعمال کیا جاتا ہے۔ پوری درخواست میں مکمل رسائی۔
  5. سرفہرست 50 جاوا کور انٹرویو کے سوالات اور جوابات۔  حصہ 1 - 2

10. اوور رائڈنگ کے طریقے کیا ہیں؟

طریقہ اوور رائیڈنگ اس وقت ہوتی ہے جب بچہ والدین کی کلاس کے رویے کو تبدیل کرنا چاہتا ہے۔ اگر آپ چاہتے ہیں کہ پیرنٹ میتھڈ میں کیا ہے اس پر عمل کیا جائے، تو آپ بچے میں super.methodName() جیسی تعمیر استعمال کرسکتے ہیں، جو پیرنٹ میتھڈ کا کام کرے گا، اور اس کے بعد ہی منطق شامل کریں۔ ضروریات کو پورا کیا جائے:
  • طریقہ کار کے دستخط ایک جیسے ہونے چاہئیں۔
  • واپسی کی قیمت ایک ہی ہونی چاہئے۔

11. طریقہ دستخط کیا ہے؟

سرفہرست 50 جاوا کور انٹرویو کے سوالات اور جوابات۔  حصہ 1 - 3طریقہ دستخط طریقہ کے نام اور ان دلائل کا ایک مجموعہ ہے جسے طریقہ قبول کرتا ہے۔ طریقوں کو اوورلوڈنگ کرتے وقت طریقہ کا دستخط ایک طریقہ کا منفرد شناخت کنندہ ہوتا ہے۔

12. طریقہ اوورلوڈنگ کیا ہے؟

طریقہ اوورلوڈنگ پولیمورفزم کی ایک خاصیت ہے جس میں طریقہ کار کے دستخط کو تبدیل کرکے، آپ ایک ہی کام کے لیے مختلف طریقے تشکیل دے سکتے ہیں:
  • ایک ہی طریقہ کا نام؛
  • مختلف دلائل؛
  • واپسی کی ایک مختلف قسم ہو سکتی ہے۔
مثال کے طور پر، مندرجہ ذیل add()کے ArrayListطور پر اوورلوڈ کیا جا سکتا ہے اور آنے والے دلائل پر منحصر ہے، ایک مختلف طریقے سے اضافہ کرے گا:
  • add(Object o)- صرف ایک چیز جوڑتا ہے؛
  • add(int index, Object o)- ایک مخصوص انڈیکس میں کسی چیز کو شامل کرتا ہے۔
  • add(Collection<Object> c)- اشیاء کی فہرست شامل کرتا ہے۔
  • add(int index, Collection<Object> c)- ایک مخصوص انڈیکس سے شروع ہونے والی اشیاء کی فہرست شامل کرتا ہے۔

13. انٹرفیس کیا ہے؟

جاوا میں ایک سے زیادہ وراثت کو لاگو نہیں کیا گیا ہے، اس لیے اس مسئلے پر قابو پانے کے لیے، انٹرفیس جیسا کہ ہم جانتے ہیں کہ ان کو شامل کیا گیا تھا؛) ایک طویل عرصے سے، انٹرفیس کے پاس صرف ان کے نفاذ کے بغیر طریقے تھے۔ اس جواب کے حصے کے طور پر، ہم ان کے بارے میں بات کریں گے۔ مثال کے طور پر:

public interface Animal {
   void makeSound();
   void eat();
   void sleep();
}
اس سے چند باریکیاں سامنے آتی ہیں:
  • انٹرفیس میں تمام طریقے عوامی اور خلاصہ ہیں۔
  • تمام متغیرات عوامی جامد حتمی ہیں؛
  • کلاسیں ان کو وراثت میں نہیں ملتی ہیں (توسیع کرتی ہیں)، لیکن ان پر عمل درآمد کرتی ہیں۔ مزید یہ کہ آپ جتنے چاہیں انٹرفیس نافذ کرسکتے ہیں۔
  • انٹرفیس کو نافذ کرنے والی کلاسوں کو ان تمام طریقوں کا نفاذ فراہم کرنا چاہیے جو انٹرفیس کے پاس ہیں۔
اس طرح:
public class Cat implements Animal {
   public void makeSound() {
       // method implementation
   }

   public void eat() {
       // implementation
   }

   public void sleep() {
       // implementation
   }
}

14. انٹرفیس میں پہلے سے طے شدہ طریقہ کیا ہے؟

اب ہم پہلے سے طے شدہ طریقوں کے بارے میں بات کرتے ہیں۔ کس کے لیے، کس کے لیے؟ ہر چیز کو "آپ کا اور ہمارا" بنانے کے لیے یہ طریقے شامل کیے گئے تھے۔ میں کس بارے میں بات کر رہا ہوں؟ ہاں، ایک طرف، نئی فعالیت کو شامل کرنا ضروری تھا: lambdas، Stream API، دوسری طرف، جاوا کو چھوڑنا ضروری تھا جس کے لیے مشہور ہے - پسماندہ مطابقت۔ ایسا کرنے کے لئے، انٹرفیس میں تیار حل متعارف کرانے کے لئے ضروری تھا. اس طرح پہلے سے طے شدہ طریقے ہمارے پاس آئے۔ یعنی پہلے سے طے شدہ طریقہ انٹرفیس میں ایک نافذ شدہ طریقہ ہے جس میں کلیدی لفظ ہے default۔ stream()مثال کے طور پر، میں معروف طریقہ Collection۔ اسے چیک کریں، یہ انٹرفیس اتنا آسان نہیں جتنا لگتا ہے؛)۔ forEach()یا سے بھی اتنا ہی معروف طریقہ Iterable۔ یہ اس وقت تک موجود نہیں تھا جب تک کہ پہلے سے طے شدہ طریقے شامل نہ کیے جائیں۔ ویسے، آپ اس کے بارے میں JavaRush پر بھی پڑھ سکتے ہیں ۔

15. پھر دو ایک جیسے پہلے سے طے شدہ طریقے کیسے حاصل کیے جائیں؟

پہلے سے طے شدہ طریقہ کیا ہے کے بارے میں پچھلے جواب کی بنیاد پر، آپ ایک اور سوال پوچھ سکتے ہیں۔ اگر آپ انٹرفیس میں طریقوں کو لاگو کرسکتے ہیں، تو نظریاتی طور پر آپ ایک ہی طریقہ کے ساتھ دو انٹرفیس کو لاگو کرسکتے ہیں، اور یہ کیسے کریں؟ ایک ہی طریقہ کے ساتھ دو مختلف انٹرفیس ہیں:
interface A {
   default void foo() {
       System.out.println("Foo A");
   }
}

interface B {
   default void foo() {
       System.out.println("Foo B");
   }
}
اور ایک کلاس ہے جو ان دو انٹرفیس کو نافذ کرتی ہے۔ foo()غیر یقینی صورتحال سے بچنے اور کوڈ کو مرتب کرنے کے لیے، ہمیں کلاس میں طریقہ کو اوور رائڈ کرنے کی ضرورت ہے ، اور ہم اس میں موجود کسی بھی انٹرفیس کے Cطریقہ کار کو آسانی سے کال کر سکتے ہیں - یا ۔ لیکن صرف ایک مخصوص انٹرفیس طریقہ کا انتخاب کیسے کریں یا ؟ اس کے لیے اس طرح کا ڈھانچہ ہے : foo()ABАВA.super.foo()
public class C implements A, B {
   @Override
   public void foo() {
       A.super.foo();
   }
}
یا:
public class C implements A, B {
   @Override
   public void foo() {
       B.super.foo();
   }
}
اس طرح، foo()کلاس کا طریقہ یا تو انٹرفیس سے Cطے شدہ طریقہ یا انٹرفیس سے کوئی طریقہ استعمال کرے گا ۔ foo()Afoo()B

16. تجریدی طریقے اور کلاسز کیا ہیں؟

جاوا میں ایک محفوظ لفظ ہے abstractجو تجریدی کلاسوں اور طریقوں کو ظاہر کرنے کے لیے استعمال ہوتا ہے۔ سب سے پہلے، کچھ تعریفیں. ایک تجریدی طریقہ ایک ایسا طریقہ ہے جو abstractخلاصہ کلاس میں مطلوبہ الفاظ کے ساتھ عمل درآمد کے بغیر بنایا گیا ہے۔ یعنی، یہ ایک طریقہ ہے جیسا کہ انٹرفیس میں، صرف مطلوبہ الفاظ کے اضافے کے ساتھ، مثال کے طور پر:
public abstract void foo();
خلاصہ کلاس ایک کلاس ہے جس میں abstractیہ لفظ بھی ہے:
public abstract class A {

}
خلاصہ کلاس میں کئی خصوصیات ہیں:
  • کوئی چیز اس کی بنیاد پر نہیں بنائی جا سکتی۔
  • اس کے تجریدی طریقے ہو سکتے ہیں۔
  • اس میں تجریدی طریقے نہیں ہوسکتے ہیں۔
کسی قسم کے تجرید کو عام کرنے کے لیے تجریدی کلاسز کی ضرورت ہوتی ہے (طاقت کے لیے معذرت)، جو حقیقی زندگی میں موجود نہیں ہے، لیکن اس میں بہت سے عام رویے اور حالتیں ہیں (یعنی طریقے اور متغیرات)۔ زندگی سے کافی سے زیادہ مثالیں ہیں۔ سب کچھ ہمارے آس پاس ہے۔ یہ "جانور"، "کار"، "جیومیٹرک فگر" وغیرہ ہو سکتا ہے۔

17. String، String Builder اور String Buffer میں کیا فرق ہے؟

اقدار کو Stringمستقل سٹرنگ پول میں محفوظ کیا جاتا ہے۔ ایک بار قطار بن جانے کے بعد، وہ اس پول میں ظاہر ہو جائے گی۔ اور اسے حذف کرنا ممکن نہیں ہوگا۔ مثال کے طور پر:
String name = "book";
... متغیر سٹرنگ پول کا حوالہ دے گا Constant string pool سرفہرست 50 جاوا کور انٹرویو کے سوالات اور جوابات۔  حصہ 1 - 4 اگر آپ متغیر کا نام مختلف قدر پر سیٹ کرتے ہیں، تو آپ کو درج ذیل ملے گا:
name = "pen";
Constant string pool سرفہرست 50 جاوا کور انٹرویو کے سوالات اور جوابات۔  حصہ 1 - 5تو یہ دونوں قدریں وہیں رہیں گی۔ سٹرنگ بفر:
  • قدریں Stringاسٹیک پر محفوظ ہیں۔ اگر قدر بدل جاتی ہے، تو نئی قدر پرانی سے بدل دی جائے گی۔
  • String Bufferمطابقت پذیر اور اس وجہ سے تھریڈ محفوظ؛
  • دھاگے کی حفاظت کی وجہ سے، آپریشن کی رفتار مطلوبہ حد تک رہ جاتی ہے۔
مثال:
StringBuffer name = "book";
سرفہرست 50 جاوا کور انٹرویو کے سوالات اور جوابات۔  حصہ 1 - 6جیسے ہی نام کی قدر تبدیل ہوتی ہے، اسٹیک پر ویلیو بدل جاتی ہے: سرفہرست 50 جاوا کور انٹرویو کے سوالات اور جوابات۔  حصہ 1 - 7StringBuilder بالکل اسی طرح StringBuffer، صرف یہ تھریڈ محفوظ نہیں ہے۔ لہذا، اس کی رفتار واضح طور پر میں سے زیادہ ہے StringBuffer۔

18. تجریدی کلاس اور انٹرفیس میں کیا فرق ہے؟

خلاصہ کلاس:
  • خلاصہ کلاسوں کا ایک ڈیفالٹ کنسٹرکٹر ہوتا ہے۔ جب بھی اس تجریدی کلاس کا بچہ پیدا ہوتا ہے اسے کہا جاتا ہے۔
  • خلاصہ اور غیر تجریدی دونوں طریقوں پر مشتمل ہے۔ مجموعی طور پر، اس میں تجریدی طریقوں پر مشتمل نہیں ہوسکتا ہے، لیکن پھر بھی ایک تجریدی کلاس ہو سکتی ہے۔
  • ایک کلاس جو تجریدی سے وراثت میں ملتی ہے اسے صرف تجریدی طریقوں کو نافذ کرنا ہوگا۔
  • ایک تجریدی کلاس میں ایک مثال متغیر ہو سکتا ہے (سوال نمبر 5 دیکھیں)۔
انٹرفیس:
  • کوئی کنسٹرکٹر نہیں ہے اور اسے شروع نہیں کیا جا سکتا۔
  • صرف تجریدی طریقوں کو شامل کیا جانا چاہئے (پہلے سے طے شدہ طریقوں کو شمار نہیں کرنا)؛
  • انٹرفیس کو نافذ کرنے والی کلاسوں کو تمام طریقوں کو لاگو کرنا چاہیے (پہلے سے طے شدہ طریقوں کو شمار نہیں کرنا)؛
  • انٹرفیس صرف مستقل پر مشتمل ہو سکتے ہیں۔

19. ایک صف میں کسی عنصر تک رسائی O(1) کیوں لیتی ہے؟

یہ سوال لفظی طور پر آخری انٹرویو سے ہے۔ جیسا کہ میں نے بعد میں سیکھا، یہ سوال اس لیے پوچھا جاتا ہے کہ کوئی شخص کیسا سوچتا ہے۔ یہ واضح ہے کہ اس علم میں کوئی عملی معنی نہیں ہے: صرف اس حقیقت کو جاننا کافی ہے۔ سب سے پہلے، ہمیں یہ واضح کرنے کی ضرورت ہے کہ O(1) ایک الگورتھم کی وقتی پیچیدگی کے لیے ایک عہدہ ہے جب آپریشن مستقل وقت میں ہوتا ہے۔ یعنی یہ عہدہ سب سے تیز عمل ہے۔ اس سوال کا جواب دینے کے لیے، ہمیں یہ سمجھنے کی ضرورت ہے کہ ہم arrays کے بارے میں کیا جانتے ہیں؟ ایک صف بنانے کے لیے int، ہمیں درج ذیل لکھنا چاہیے:
int[] intArray = new int[100];
اس ریکارڈنگ سے کئی نتائج اخذ کیے جا سکتے ہیں:
  1. ایک ارے بناتے وقت، اس کی قسم معلوم ہوتی ہے، اگر قسم معلوم ہے، تو یہ واضح ہے کہ صف کے ہر سیل کا سائز کیا ہوگا۔
  2. یہ معلوم ہے کہ صف کا سائز کیا ہوگا۔
یہ اس سے مندرجہ ذیل ہے: یہ سمجھنے کے لیے کہ کس سیل کو لکھنا ہے، آپ کو صرف یہ حساب کرنے کی ضرورت ہے کہ کس میموری ایریا کو لکھنا ہے۔ ایک کار کے لیے یہ آسان نہیں ہو سکتا۔ مشین میں مختص میموری کا آغاز، متعدد عناصر اور ایک سیل کا سائز ہے۔ اس سے یہ واضح ہے کہ ریکارڈنگ کی جگہ صف کے شروع ہونے والے مقام کے برابر ہوگی + سیل کے سائز کو اس کے سائز سے ضرب۔

آپ ArrayList میں اشیاء تک رسائی حاصل کرنے میں O(1) کیسے حاصل کرتے ہیں؟

یہ سوال فوری طور پر پچھلے ایک کی پیروی کرتا ہے۔ یہ سچ ہے کہ جب ہم کسی صف کے ساتھ کام کرتے ہیں اور وہاں پرائمیٹو موجود ہوتے ہیں، تو ہمیں پہلے سے معلوم ہوتا ہے کہ جب اس قسم کی تخلیق ہوتی ہے تو اس کا سائز کیا ہوتا ہے۔ لیکن کیا ہوگا اگر ہمارے پاس تصویر میں جیسی اسکیم ہے: سرفہرست 50 جاوا کور انٹرویو کے سوالات اور جوابات۔  حصہ 1 - 8اور ہم قسم A کے عناصر کے ساتھ ایک مجموعہ بنانا چاہتے ہیں، اور مختلف نفاذات شامل کرنا چاہتے ہیں - B, C, D:
List<A> list = new ArrayList();
list.add(new B());
list.add(new C());
list.add(new D());
list.add(new B());
اس صورت حال میں کیسے سمجھیں کہ ہر سیل کا سائز کیا ہوگا، کیونکہ ہر شے مختلف ہوگی اور اس میں مختلف اضافی فیلڈز (یا بالکل مختلف ہوسکتے ہیں)۔ کیا کرنا ہے؟ یہاں سوال اس طرح پیش کیا گیا ہے کہ الجھاؤ اور الجھاؤ۔ ہم جانتے ہیں کہ حقیقت میں، مجموعہ اشیاء کو ذخیرہ نہیں کرتا ہے، لیکن صرف ان اشیاء سے لنک کرتا ہے. اور تمام لنکس کا سائز ایک ہی ہے، اور یہ معلوم ہے۔ تو اسپیس گنتی یہاں اسی طرح کام کرتی ہے جیسے پچھلے سوال میں۔

21. آٹو باکسنگ اور ان باکسنگ

تاریخی پس منظر: آٹو باکسنگ اور آٹو ان باکسنگ JDK 5 کی اہم اختراعات میں سے ایک ہے۔ آٹو باکسنگ ایک قدیم قسم سے مناسب ریپر کلاس میں خودکار تبدیلی کا عمل ہے۔ آٹو ان باکسنگ - آٹو باکسنگ کے بالکل برعکس کرتا ہے - ریپر کلاس کو پرائمیٹو میں تبدیل کرتا ہے۔ لیکن اگر ریپر ویلیو ہے nullتو پیک کھولنے کے دوران ایک رعایت دی جائے گی NullPointerException۔

مماثل قدیم - چادر

قدیم ریپر کلاس
بولین بولین
int عدد
بائٹ بائٹ
چار کردار
تیرنا تیرنا
طویل لمبی
مختصر مختصر
دگنا دگنا

آٹو پیکنگ ہوتی ہے:

  • ریپر کلاس کے لیے پرائمٹیو ایک حوالہ تفویض کرتے وقت:

    جاوا 5 سے پہلے:

    //manual packaging or how it was BEFORE Java 5.
    public void boxingBeforeJava5() {
       Boolean booleanBox = new Boolean(true);
       Integer intBox = new Integer(3);
       // and so on to other types
    }
    
    после Java 5:
    //automatic packaging or how it became in Java 5.
    public void boxingJava5() {
       Boolean booleanBox = true;
       Integer intBox = 3;
       // and so on to other types
    }
  • جب کسی پرائمٹیو کو کسی ایسے طریقہ کی دلیل کے طور پر پاس کرتے ہیں جس سے ریپر کی توقع ہوتی ہے:

    public void exampleOfAutoboxing() {
       long age = 3;
       setAge(age);
    }
    
    public void setAge(Long age) {
       this.age = age;
    }

خودکار پیکنگ ہوتی ہے:

  • جب ہم ریپر کلاس کو ایک قدیم متغیر تفویض کرتے ہیں:

    //before Java 5:
    int intValue = new Integer(4).intValue();
    double doubleValue = new Double(2.3).doubleValue();
    char c = new Character((char) 3).charValue();
    boolean b = Boolean.TRUE.booleanValue();
    
    //and after JDK 5:
    int intValue = new Integer(4);
    double doubleValue = new Double(2.3);
    char c = new Character((char) 3);
    boolean b = Boolean.TRUE;
  • ریاضی کی کارروائیوں کے معاملات میں۔ وہ صرف قدیم اقسام پر لاگو ہوتے ہیں؛ اس کے لیے آپ کو پرائمٹیو کو ان باکسنگ کرنے کی ضرورت ہے۔

    // Before Java 5
    Integer integerBox1 = new Integer(1);
    Integer integerBox2 = new Integer(2);
    
    // for comparison it was necessary to do this:
    integerBox1.intValue() > integerBox2.intValue()
    
    //в Java 5
    integerBox1 > integerBox2
  • جب کسی ایسے طریقہ میں ریپر کو دیا جاتا ہے جو متعلقہ قدیم کو قبول کرتا ہے:

    public void exampleOfAutoboxing() {
       Long age = new Long(3);
       setAge(age);
    }
    
    public void setAge(long age) {
       this.age = age;
    }

22. حتمی مطلوبہ لفظ کیا ہے اور اسے کہاں استعمال کیا جائے؟

کلیدی لفظ finalمتغیرات، طریقوں اور کلاسوں کے لیے استعمال کیا جا سکتا ہے۔
  1. ایک حتمی متغیر کسی دوسرے آبجیکٹ کو دوبارہ تفویض نہیں کیا جا سکتا۔
  2. فائنل کلاس جراثیم سے پاک ہے)) اس کے وارث نہیں ہوسکتے ہیں۔
  3. آخری طریقہ کسی اجداد پر اوور رائڈ نہیں کیا جا سکتا۔
ہم نے اوپر کا احاطہ کیا ہے، اب آئیے اس پر مزید تفصیل سے بات کرتے ہیں۔

حتمی متغیرات

جاوا ہمیں متغیر بنانے اور اسے کچھ قدر تفویض کرنے کے دو طریقے فراہم کرتا ہے:
  1. آپ متغیر کا اعلان کر سکتے ہیں اور اسے بعد میں شروع کر سکتے ہیں۔
  2. آپ متغیر کا اعلان کر سکتے ہیں اور اسے فوری طور پر تفویض کر سکتے ہیں۔
ان معاملات کے لیے حتمی متغیر کا استعمال کرنے کی مثال:
public class FinalExample {

   //final static variable, which is immediately initialized:
   final static String FINAL_EXAMPLE_NAME = "I'm likely final one";

   //final is a variable that is not initialized, but will only work if
   //initialize this in the constructor:
   final long creationTime;

   public FinalExample() {
       this.creationTime = System.currentTimeMillis();
   }

   public static void main(String[] args) {
       FinalExample finalExample = new FinalExample();
       System.out.println(finalExample.creationTime);

       // final field FinalExample.FINAL_EXAMPLE_NAME cannot be assigned
//    FinalExample.FINAL_EXAMPLE_NAME = "Not you're not!";

       // final field Config.creationTime cannot be assigned
//    finalExample.creationTime = 1L;
   }
}

کیا حتمی متغیر کو مستقل سمجھا جا سکتا ہے؟

چونکہ ہم حتمی متغیر کو نئی قدر تفویض نہیں کر سکیں گے، اس لیے ایسا معلوم ہوتا ہے کہ یہ مستقل متغیر ہیں۔ لیکن یہ صرف پہلی نظر میں ہے۔ اگر ڈیٹا کی قسم جس سے متغیر کا حوالہ دیا جاتا ہے وہ ہے immutable، تو ہاں، یہ ایک مستقل ہے۔ لیکن اگر ڈیٹا کی قسم mutableمتغیر ہے تو طریقوں اور متغیرات کا استعمال کرتے ہوئے اس چیز کی قدر کو تبدیل کرنا ممکن ہو گا جس کی طرف finalمتغیر کا حوالہ دیا گیا ہے، اور اس صورت میں اسے مستقل نہیں کہا جا سکتا۔ لہذا، مثال سے پتہ چلتا ہے کہ حتمی متغیرات میں سے کچھ واقعی مستقل ہیں، لیکن کچھ نہیں ہیں، اور انہیں تبدیل کیا جا سکتا ہے۔
public class FinalExample {

   //immutable final variables:
   final static String FINAL_EXAMPLE_NAME = "I'm likely final one";
   final static Integer FINAL_EXAMPLE_COUNT  = 10;

   // mutable filter variables
   final List<String> addresses = new ArrayList();
   final StringBuilder finalStringBuilder = new StringBuilder("constant?");
}

مقامی حتمی متغیرات

جب finalایک طریقہ کے اندر ایک متغیر بنایا جاتا ہے، تو اسے local finalمتغیر کہا جاتا ہے:
public class FinalExample {

   public static void main(String[] args) {
       // This is how you can
       final int minAgeForDriveCar = 18;

       // or you can do it this way, in the foreach loop:
       for (final String arg : args) {
           System.out.println(arg);
       }
   }

}
ہم مطلوبہ الفاظ کو finalتوسیعی لوپ میں استعمال کر سکتے ہیں forکیونکہ لوپ کی تکرار کو مکمل کرنے کے بعد، forہر بار ایک نیا متغیر بنایا جاتا ہے۔ لیکن یہ ایک نارمل فار لوپ پر لاگو نہیں ہوتا ہے، لہذا نیچے دیا گیا کوڈ کمپائل ٹائم ایرر پھینک دے گا۔
// final local changed j cannot be assigned
for (final int i = 0; i < args.length; i ++) {
   System.out.println(args[i]);
}

فائنل کلاس

آپ اعلان کردہ کلاس میں توسیع نہیں کر سکتے final۔ سیدھے الفاظ میں، کوئی بھی طبقہ اس سے وراثت نہیں پا سکتا۔ finalJDK میں کلاس کی ایک عمدہ مثال ہے String۔ ایک ناقابل تغیر کلاس بنانے کا پہلا قدم اسے بطور نشان زد کرنا ہے final، تاکہ اسے بڑھایا نہ جا سکے۔
public final class FinalExample {
}

// Compilation error here
class WantsToInheritFinalClass extends FinalExample {
}

حتمی طریقے

جب کسی طریقہ کو حتمی نشان زد کیا جاتا ہے، تو اسے حتمی طریقہ کہا جاتا ہے (منطقی، صحیح؟) آخری طریقہ کو نسلی طبقے میں اوور رائڈ نہیں کیا جا سکتا۔ ویسے، آبجیکٹ کلاس میں طریقے - wait() اور notify() - حتمی ہیں، اس لیے ہمارے پاس ان کو اوور رائڈ کرنے کا موقع نہیں ہے۔
public class FinalExample {
   public final String generateAddress() {
       return "Some address";
   }
}

class ChildOfFinalExample extends FinalExample {

   // compile error here
   @Override
   public String generateAddress() {
       return "My OWN Address";
   }
}

جاوا میں فائنل کیسے اور کہاں استعمال کریں۔

  • کچھ کلاس لیول کنسٹینٹس کی وضاحت کے لیے حتمی کلیدی لفظ استعمال کریں۔
  • اشیاء کے لیے حتمی متغیرات بنائیں جب آپ ان میں ترمیم نہیں کرنا چاہتے۔ مثال کے طور پر، آبجیکٹ کی مخصوص خصوصیات جو ہم لاگنگ کے مقاصد کے لیے استعمال کر سکتے ہیں۔
  • اگر آپ نہیں چاہتے کہ کلاس میں توسیع کی جائے تو اسے حتمی کے طور پر نشان زد کریں۔
  • اگر آپ کو ایک ناقابل تبدیلی < کلاس بنانے کی ضرورت ہے، تو آپ کو اسے حتمی بنانا ہوگا؛
  • اگر آپ چاہتے ہیں کہ کسی طریقہ کا نفاذ اس کی اولاد میں تبدیل نہ ہو، تو طریقہ کو بطور نامزد کریں final۔ یہ یقینی بنانے کے لیے بہت ضروری ہے کہ عمل درآمد میں کوئی تبدیلی نہ آئے۔

23. متغیر متغیر کیا ہے؟

تغیر پذیر

تغیر پذیر وہ اشیاء ہیں جن کی حالتیں اور متغیرات تخلیق کے بعد تبدیل کی جا سکتی ہیں۔ مثال کے طور پر، StringBuilder، StringBuffer جیسی کلاسز۔ مثال:
public class MutableExample {

   private String address;

   public MutableExample(String address) {
       this.address = address;
   }

   public String getAddress() {
       return address;
   }

   // this setter can change the name field
   public void setAddress(String address) {
       this.address = address;
   }

   public static void main(String[] args) {

       MutableExample obj = new MutableExample("first address");
       System.out.println(obj.getAddress());

       // update the name field, so this is a mutable object
       obj.setAddress("Updated address");
       System.out.println(obj.getAddress());
   }
}

ناقابل تغیر

ناقابل تغیر وہ اشیاء ہیں جن کی حالتیں اور متغیرات آبجیکٹ بننے کے بعد تبدیل نہیں ہوسکتے ہیں۔ ہیش میپ کے لیے ایک بہترین کلید کیوں نہیں، ٹھیک ہے؟) مثال کے طور پر، سٹرنگ، انٹیجر، ڈبل وغیرہ۔ مثال:
// make this class final so no one can change it
public final class ImmutableExample {

   private String address;

   ImmutableExample (String address) {
       this.address = address;
   }

   public String getAddress() {
       return address;
   }

   //remove the setter

   public static void main(String[] args) {

       ImmutableExample obj = new ImmutableExample("old address");
       System.out.println(obj.getAddress());

       // Therefore, do not change this field in any way, so this is an immutable object
       // obj.setName("new address");
       // System.out.println(obj.getName());

   }
}

24. ایک ناقابل تغیر کلاس کیسے لکھیں؟

جب آپ یہ جان لیں کہ متغیر اور غیر متغیر اشیاء کیا ہیں، اگلا سوال قدرتی ہے - اسے کیسے لکھا جائے؟ ایک ناقابل تغیر ناقابل تغیر کلاس لکھنے کے لیے، آپ کو آسان اقدامات پر عمل کرنے کی ضرورت ہے:
  • کلاس کو فائنل بنائیں۔
  • تمام شعبوں کو نجی بنائیں اور ان کے لیے صرف حاصل کرنے والے بنائیں۔ سیٹرز، بالکل، ضرورت نہیں ہے.
  • تمام متغیر فیلڈز کو حتمی بنائیں تاکہ قیمت صرف ایک بار سیٹ کی جاسکے۔
  • کنسٹرکٹر کے ذریعے تمام فیلڈز کو شروع کریں، ایک گہری کاپی انجام دیں (یعنی آبجیکٹ کو خود کاپی کرنا، اس کے متغیرات، متغیرات کے متغیرات وغیرہ)
  • حاصل کرنے والوں میں تغیر پذیر متغیر آبجیکٹ کو صرف اقدار کی کاپیاں واپس کرنے کے لیے کلون کریں نہ کہ اصل اشیاء کے حوالے۔
مثال:
/**
* An example of creating an immutable object.
*/
public final class FinalClassExample {

   private final int age;

   private final String name;

   private final HashMap<String, String> addresses;

   public int getAge() {
       return age;
   }


   public String getName() {
       return name;
   }

   /**
    * Clone the object before returning it.
    */
   public HashMap<String, String> getAddresses() {
       return (HashMap<String, String>) addresses.clone();
   }

   /**
    * In the constructor, deep copy the mutable objects.
    */
   public FinalClassExample(int age, String name, HashMap<String, String> addresses) {
       System.out.println("Performing a deep copy in the constructor");
       this.age = age;
       this.name = name;
       HashMap<String, String> temporaryMap = new HashMap<>();
       String key;
       Iterator<String> iterator = addresses.keySet().iterator();
       while (iterator.hasNext()) {
           key = iterator.next();
           temporaryMap.put(key, addresses.get(key));
       }
       this.addresses = temporaryMap;
   }
}
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION