CodeGym /جاوا بلاگ /Random-UR /جاوا ڈویلپر کی پوزیشن کے لیے نوکری کے انٹرویو سے سوالات ا...
John Squirrels
سطح
San Francisco

جاوا ڈویلپر کی پوزیشن کے لیے نوکری کے انٹرویو سے سوالات اور جوابات تلاش کرنا۔ حصہ 7

گروپ میں شائع ہوا۔
سلام سب کو! پروگرامنگ خرابیوں سے بھری ہوئی ہے۔ اور شاید ہی کوئی ایک ایسا موضوع ہو جس کی وجہ سے آپ کو ٹھوکر نہ لگے اور آپ کے پیر کو ٹھوکر نہ لگے۔ یہ خاص طور پر beginners کے لئے سچ ہے. اپنی انگلیوں کو بچانے کا واحد طریقہ سیکھنا ہے۔ خاص طور پر، آپ کو انتہائی بنیادی موضوعات میں گہرائی میں ڈوبنے کی ضرورت ہے۔ آج، ہم جاوا ڈویلپرز کے انٹرویوز کے دوران مقبول ترین سوالات کا جائزہ جاری رکھیں گے۔ انٹرویو کے یہ سوالات بنیادی موضوعات کا احاطہ کرنے کا بہترین کام کرتے ہیں۔ نوٹ کریں کہ فہرست میں کچھ غیر معیاری سوالات بھی شامل ہیں جو آپ کو عام مسائل سے مختلف طریقے سے رجوع کرنے دیتے ہیں۔ جاوا ڈویلپر کی پوزیشن کے لیے نوکری کے انٹرویو سے سوالات اور جوابات تلاش کرنا۔  حصہ 7 - 1

62. سٹرنگ پول کیا ہے، اور اس کی ضرورت کیوں ہے؟

جاوا پروگرام کو دستیاب میموری کے کچھ حصے کو ہیپ کہا جاتا ہے (جس کے بارے میں ہم بعد میں بات کریں گے)، اور ہیپ کے کچھ حصے کو String pool کہا جاتا ہے ۔ یہ سٹرنگ ویلیوز کو ذخیرہ کرنے کے لیے ہے۔ دوسرے لفظوں میں، جب آپ سٹرنگ بناتے ہیں، مثال کے طور پر، اس طرح کے ڈبل کوٹس کا استعمال کرتے ہوئے:
String str = "Hello world";
JVM چیک کرتا ہے کہ آیا سٹرنگ پول میں پہلے سے ہی مخصوص قدر موجود ہے۔ اگر ایسا ہوتا ہے، تو str متغیر کو پول میں اس قدر کا حوالہ تفویض کیا جاتا ہے۔ اگر ایسا نہیں ہوتا ہے تو، پول میں ایک نئی قدر بنائی جاتی ہے، اور اس کا حوالہ str متغیر کو تفویض کیا جاتا ہے۔ آئیے ایک مثال پر غور کریں:
String firstStr = "Hello world";
String secondStr = "Hello world";
System.out.println(firstStr == secondStr);
سچ سکرین پر دکھایا جائے گا. یاد رکھیں کہ == حوالہ جات کا موازنہ کرتا ہے، اور یہ دو متغیرات سٹرنگ پول میں ایک ہی قدر کی طرف اشارہ کرتے ہیں۔ یہ میموری میں بہت سی ایک جیسی String اشیاء پیدا کرنے سے بچنے میں مدد کرتا ہے۔ ہم ایسا کر سکتے ہیں کیونکہ، جیسا کہ آپ کو یاد ہوگا، String ایک ناقابل تغیر کلاس ہے، اس لیے ایک ہی قدر کے متعدد حوالہ جات رکھنے میں کوئی حرج نہیں ہے۔ اب یہ ناممکن ہے کہ ایسی صورت حال ہو جس میں ایک جگہ قدر کو تبدیل کرنے سے کئی دوسرے حوالوں میں تبدیلی آئے۔ پھر بھی، اگر ہم استعمال کرتے ہوئے ایک تار بناتے ہیں new :
String str = new String("Hello world");
پھر میموری میں ایک الگ آبجیکٹ بنتا ہے اور مخصوص سٹرنگ ویلیو کو اسٹور کرتا ہے (اس سے کوئی فرق نہیں پڑتا کہ وہ ویلیو پہلے سے سٹرنگ پول میں ہے)۔ اس دعوے کی تصدیق کے لیے اس پر غور کریں:
String firstStr = new String("Hello world");
String secondStr = "Hello world";
String thirdStr = new String("Hello world");
System.out.println(firstStr == secondStr);
System.out.println(firstStr == thirdStr);
ہمیں دو لائنیں ملیں گی جو غلط کی نشاندہی کرتی ہیں ، جس کا مطلب ہے کہ ہمارے پاس تین الگ الگ تار ہیں۔ بنیادی طور پر، یہی وجہ ہے کہ آپ کو صرف ڈبل کوٹس کا استعمال کرتے ہوئے تار بنانا چاہیے۔ اس نے کہا، سٹرنگ پول میں اقدار کو شامل کرنا (یا اس کا حوالہ حاصل کرنا) ممکن ہے یہاں تک کہ نئے مطلوبہ الفاظ کا استعمال کرتے ہوئے کوئی آبجیکٹ بناتے وقت۔ ایسا کرنے کے لیے، ہم سٹرنگ کلاس کا انٹرن() طریقہ استعمال کرتے ہیں۔ یہ طریقہ اس بات کو یقینی بناتا ہے کہ ہم یا تو سٹرنگ پول میں ویلیو بناتے ہیں یا اگر یہ پہلے سے موجود ہے تو ہمیں اس کا حوالہ ملتا ہے۔ یہاں ایک مثال ہے:
String firstStr = new String("Hello world").intern();
String secondStr = "Hello world";
String thirdStr = new String("Hello world").intern();
System.out.println(firstStr == secondStr);
System.out.println(firstStr == thirdStr);
System.out.println(secondStr == thirdStr);
یہ کوڈ تین بار کنسول پر درست نکلتا ہے ، جو ہمیں بتاتا ہے کہ تینوں متغیرات میموری میں ایک ہی تار کا حوالہ دیتے ہیں۔

63. سٹرنگ پول میں کیا GoF ڈیزائن پیٹرن استعمال کیے جاتے ہیں؟

سٹرنگ پول میں، GoF ڈیزائن پیٹرن فلائی ویٹ پیٹرن ہے۔ اگر آپ نے یہاں کوئی اور ڈیزائن پیٹرن دیکھا ہے، تو اسے تبصروں میں شیئر کریں۔ یہاں ہم فلائی ویٹ ڈیزائن پیٹرن کے بارے میں بات کریں گے۔ یہ ایک ساختی ڈیزائن کا نمونہ ہے جس میں ایک ایسی چیز جو پروگرام میں مختلف جگہوں پر اپنے آپ کو ایک منفرد مثال کے طور پر پیش کرتی ہے دراصل منفرد نہیں ہے۔ فلائی ویٹ ہر آبجیکٹ میں ایک جیسے ڈیٹا کو ذخیرہ کرنے کے بجائے اشیاء کی مشترکہ حالت کو ذخیرہ کرکے میموری کو بچاتا ہے۔ خلاصہ کو سمجھنے کے لیے، اس ابتدائی مثال پر غور کریں۔ ہم کہتے ہیں کہ ہمارے پاس ملازم انٹرفیس ہے:
public interface Employee {
   void work();
}
اور اس کے کچھ نفاذ ہیں، جیسے وکیل کی کلاس:
public class Lawyer implements Employee {

   public Lawyer() {
       System.out.println("A lawyer was hired.");
   }

   @Override
   public void work() {
       System.out.println("Settling legal issues...");
   }
}
اور اکاؤنٹنٹ کلاس:
public class Accountant implements Employee {

   public Accountant() {
       System.out.println("An accountant was hired.");
   }

   @Override
   public void work() {
       System.out.println("Keeping accounting records...");
   }
}
طریقے مکمل طور پر من مانی ہیں - اس مثال کے لیے، ہمیں صرف یہ دیکھنے کی ضرورت ہے کہ ان پر عمل کیا جا رہا ہے۔ کنسٹرکٹر کے بارے میں بھی ایسا ہی ہے۔ کنسول آؤٹ پٹ ہمیں بتاتا ہے کہ نئی اشیاء کب بنتی ہیں۔ ہمارے پاس انسانی وسائل کا محکمہ بھی ہے جس کا کام درخواست کردہ ملازم کو واپس کرنا ہے۔ اگر وہ ملازم پہلے سے ہی عملے میں نہیں ہے، تو اس کی خدمات حاصل کی جاتی ہیں اور محکمہ HR نئے ملازم کو واپس کرتا ہے:
public class HumanResourcesDepartment {
   private Map<String, Employee> currentEmployees = new HashMap<>();

   public Employee getEmployee(String type) throws Exception {
       Employee result;
       if (currentEmployees.containsKey(type)) {
           result = currentEmployees.get(type);
       } else {
           switch (type) {
               case "Accountant":
                   result = new Accountant();
                   currentEmployees.put(type, result);
                   break;
               case "Lawyer":
                   result = new Lawyer();
                   currentEmployees.put(type, result);
                   break;
               default:
                   throw new Exception("This employee is not on the staff!");
           }
       }
       return result;
   }
}
لہذا، منطق آسان ہے: اگر مطلوبہ چیز موجود ہے، تو اسے واپس کر دیں؛ اگر نہیں، تو اسے بنائیں، اسے سٹوریج میں رکھیں (کیشے کی طرح کچھ)، اور اسے واپس کریں۔ اب دیکھتے ہیں کہ یہ سب کیسے کام کرتا ہے:
public static void main(String[] args) throws Exception {
   HumanResourcesDepartment humanResourcesDepartment = new HumanResourcesDepartment();
   Employee empl1 = humanResourcesDepartment.getEmployee("Lawyer");
   empl1.work();
   Employee empl2 = humanResourcesDepartment.getEmployee("Accountant");
   empl2.work();
   Employee empl3 = humanResourcesDepartment.getEmployee("Lawyer");
   empl1.work();
   Employee empl4 = humanResourcesDepartment.getEmployee("Accountant");
   empl2.work();
   Employee empl5 = humanResourcesDepartment.getEmployee("Lawyer");
   empl1.work();
   Employee empl6 = humanResourcesDepartment.getEmployee("Accountant");
   empl2.work();
   Employee empl7 = humanResourcesDepartment.getEmployee("Lawyer");
   empl1.work();
   Employee empl8 = humanResourcesDepartment.getEmployee("Accountant");
   empl2.work();
   Employee empl9 = humanResourcesDepartment.getEmployee("Lawyer");
   empl1.work();
   Employee empl10 = humanResourcesDepartment.getEmployee("Accountant");
   empl2.work();
}
یہ ہے جو ہم کنسول میں دیکھیں گے:
ایک وکیل رکھا گیا۔ قانونی مسائل کو حل کرنا... ایک اکاؤنٹنٹ کی خدمات حاصل کی گئیں۔ اکاؤنٹنگ ریکارڈ رکھنا... قانونی مسائل کو حل کرنا... اکاؤنٹنگ ریکارڈ رکھنا... قانونی مسائل کو حل کرنا... اکاؤنٹنگ ریکارڈ رکھنا... قانونی مسائل کو حل کرنا... اکاؤنٹنگ ریکارڈ رکھنا... قانونی مسائل کو حل کرنا... اکاؤنٹنگ رکھنا ریکارڈز…
جیسا کہ آپ دیکھ سکتے ہیں، ہم نے صرف دو اشیاء بنائی ہیں اور انہیں کئی بار دوبارہ استعمال کیا ہے۔ مثال بہت آسان ہے، لیکن یہ ظاہر کرتی ہے کہ یہ ڈیزائن پیٹرن ہمارے وسائل کو کیسے محفوظ رکھ سکتا ہے۔ جیسا کہ آپ نے دیکھا ہوگا، اس طرز کی منطق تکلیف دہ طور پر انشورنس پول کی منطق سے ملتی جلتی ہے۔ جاوا ڈویلپر کی پوزیشن کے لیے نوکری کے انٹرویو سے سوالات اور جوابات تلاش کرنا۔  حصہ 7 - 2

64. ہم ایک تار کو حصوں میں کیسے تقسیم کرتے ہیں؟ متعلقہ کوڈ کی مثال دیں۔

ظاہر ہے، یہ سوال تقسیم کے طریقہ کار کے بارے میں ہے۔ اسٹرنگ کلاس میں اس طریقہ کی دو مختلف حالتیں ہیں:
String split(String regex);
اور
String split(String regex);
ریجیکس پیرامیٹر ڈیلیمیٹر ہے — کچھ ریگولر ایکسپریشن جو سٹرنگ کو سٹرنگ کی ایک صف میں تقسیم کرنے کے لیے استعمال ہوتے ہیں، مثال کے طور پر :
String str = "Hello, world it's Amigo!";
String[] arr = str.split("\\s");
for (String s : arr) {
  System.out.println(s);
}
کنسول دکھائے گا:
ہیلو، دنیا یہ امیگو ہے!
لہٰذا، ہماری سٹرنگ کو سٹرنگز کی ایک صف میں تقسیم کر دیا گیا، اسپیس کو ڈیلیمیٹر کے طور پر استعمال کرتے ہوئے (باقاعدہ اظہار "\\s" کی بجائے ، ہم عام سٹرنگ ایکسپریشن " " بھی استعمال کر سکتے تھے )۔ دوسرا، اوورلوڈ ویرینٹ، ایک اضافی حد پیرامیٹر رکھتا ہے۔ حد نتیجے کی صف کی زیادہ سے زیادہ اجازت شدہ سائز ہے۔ دوسرے لفظوں میں، ایک بار جب سٹرنگ کو سب اسٹرنگز کی زیادہ سے زیادہ اجازت شدہ تعداد میں تقسیم کر دیا جاتا ہے، تو اسپلٹنگ رک جاتی ہے، اور آخری عنصر میں ممکنہ طور پر غیر تقسیم شدہ سٹرنگ سے کوئی "بقیہ حصہ" ہو گا۔ مثال:
String str = "Hello, world it's Amigo!";
String[] arr = str.split(" ", 2);
for (String s : arr) {
  System.out.println(s);
}
کنسول آؤٹ پٹ:
ہیلو، دنیا یہ امیگو ہے!
جیسا کہ ہم دیکھ سکتے ہیں، اگر یہ limit = 2 کے لیے نہ ہوتا تو صف کے آخری عنصر کو تین ذیلی اسٹرنگ میں تقسیم کیا جا سکتا ہے۔

65. پاس ورڈ سٹور کرنے کے لیے کریکٹر اری سٹرنگ سے بہتر کیوں ہے؟

پاس ورڈ کو ذخیرہ کرتے وقت سٹرنگ پر صف کو ترجیح دینے کی کئی وجوہات ہیں:

1. سٹرنگ پول اور سٹرنگ کی تبدیلی۔

ایک صف استعمال کرتے وقت ( char[] )، جب ہم اس کے ساتھ کام کرنے کے بعد ڈیٹا کو واضح طور پر مٹا سکتے ہیں۔ ہم جتنا چاہیں صف کو اوور رائٹ بھی کر سکتے ہیں، کوڑا کرکٹ جمع کرنے سے پہلے ہی سسٹم سے پاس ورڈ کو ختم کر سکتے ہیں (یہ کافی ہے کہ کچھ سیلز کو غلط اقدار میں تبدیل کر دیا جائے)۔ اس کے برعکس، String ایک ناقابل تغیر کلاس ہے۔ اس کا مطلب ہے کہ اگر ہم کسی String آبجیکٹ کی ویلیو کو تبدیل کرنا چاہتے ہیں تو ہمیں ایک نیا مل جائے گا، لیکن پرانا سٹرنگ پول میں ہی رہے گا۔ اگر ہم پاس ورڈ پر مشتمل سٹرنگ کو ہٹانا چاہتے ہیں ، تو ہمیں ایک پیچیدہ کام کا سامنا کرنا پڑتا ہے کیونکہ ہمیں اس قدر کو سٹرنگ پول سے ہٹانے کے لیے کوڑا اٹھانے والے کی ضرورت ہوتی ہے، لیکن یہ سٹرنگ ممکنہ طور پر طویل عرصے تک وہاں موجود رہے گی۔ یعنی، جب ڈیٹا کو محفوظ طریقے سے اسٹور کرنے کی بات آتی ہے، تو String چار صف سے کمتر ہوتی ہے ۔

2. اگر ہم سٹرنگ ویلیو کو کنسول (یا لاگ) میں آؤٹ پٹ کرتے ہیں، تو ہمیں ملتا ہے:

String password = "password";
System.out.println("Password - " + password);
کنسول آؤٹ پٹ:
پاس ورڈ - پاس ورڈ
اور اگر آپ سرنی کو کنسول پر پرنٹ کرتے ہیں:
char[] arr = new char[]{'p','a','s','s','w','o','r','d'};
System.out.println("Password - " + arr);
کنسول ناقابل فہم بکواس ظاہر کرے گا:
پاس ورڈ - [C@7f31245a
درحقیقت یہ بکواس نہیں ہے۔ جو کچھ آپ دیکھتے ہیں اسے سمجھنے کا طریقہ یہاں ہے: [C کلاس کا نام ہے - char array، @ ایک حد بندی ہے، اور پھر 7f31245a ایک ہیکساڈیسیمل ہیش کوڈ ہے۔

3. سرکاری جاوا کریپٹوگرافی آرکیٹیکچر (JCA) حوالہ گائیڈ واضح طور پر اسٹرنگ کے بجائے ایک char[] میں پاس ورڈز کو ذخیرہ کرنے کا ذکر کرتا ہے :

" java.lang.String قسم کی کسی چیز میں پاس ورڈ کو جمع کرنا اور اسٹور کرنا منطقی معلوم ہوتا ہے ۔ تاہم، یہاں انتباہ ہے: String کی قسم کے آبجیکٹ ناقابل تغیر ہیں، یعنی، کوئی ایسا طریقہ بیان نہیں کیا گیا ہے جو آپ کو تبدیل کرنے کی اجازت دے (اوور رائٹ) یا استعمال کے بعد سٹرنگ کے مواد کو صفر کر دیتا ہے ۔ یہ فیچر سٹرنگ آبجیکٹ کو سکیورٹی سے متعلق حساس معلومات جیسے کہ صارف کے پاس ورڈز کو محفوظ کرنے کے لیے نامناسب بناتا ہے۔ اس کے بجائے آپ کو ہمیشہ حفاظتی حساس معلومات کو چار صف میں جمع اور ذخیرہ کرنا چاہیے۔" جاوا ڈویلپر کی پوزیشن کے لیے نوکری کے انٹرویو سے سوالات اور جوابات تلاش کرنا۔  حصہ 7 - 3

اینوم

66. جاوا میں Enum کی مختصر تفصیل دیں۔

Enum شمار کے لیے مختصر ہے، جو کہ ایک عام قسم کے ذریعے متحد سٹرنگ کنسٹینٹ کا ایک مجموعہ ہے۔ ہم enum کلیدی لفظ کا استعمال کرتے ہوئے ایک کا اعلان کرتے ہیں۔ یہاں enum کے ساتھ ایک مثال ہے : کچھ اسکول کیمپس میں اجازت یافتہ کردار:
public enum Role {
   STUDENT,
   TEACHER,
   DIRECTOR,
   SECURITY_GUARD
}
بڑے حروف میں لکھے گئے الفاظ گنتی کے مستقل ہیں۔ ان کا اعلان نئے آپریٹر کے بغیر آسان طریقے سے کیا جاتا ہے ۔ شماریات کا استعمال زندگی کو بہت آسان بنا دیتا ہے کیونکہ وہ ناموں میں غلطیوں اور الجھنوں سے بچنے میں مدد کرتے ہیں (چونکہ فہرست صرف درست اقدار کی وضاحت کرتی ہے)۔ میرے لئے، وہ سوئچ کی تعمیر میں بہت آسان ہیں .

67. کیا ایک اینوم انٹرفیس کو لاگو کر سکتا ہے (امپلی کی ورڈ استعمال کریں)؟

جی ہاں. بہر حال، enums کو صرف غیر فعال سیٹوں سے زیادہ کی نمائندگی کرنی چاہیے (جیسے کہ اسکول کے کیمپس میں کردار)۔ جاوا میں، وہ زیادہ پیچیدہ اشیاء کی نمائندگی کر سکتے ہیں، لہذا آپ کو ان میں اضافی فعالیت شامل کرنے کی ضرورت پڑ سکتی ہے۔ یہ آپ کو انم ویلیو کو ان جگہوں پر بدل کر پولیمورفزم کا فائدہ اٹھانے کی بھی اجازت دیتا ہے جہاں لاگو انٹرفیس کی قسم کی ضرورت ہے۔

68. کیا اینوم کلاس کو بڑھا سکتا ہے (ایکسٹینڈس کی ورڈ استعمال کریں)؟

نہیں، یہ نہیں ہوسکتا، کیونکہ ایک enum پہلے سے طے شدہ Enum<T> کلاس کا ذیلی طبقہ ہے ، جہاں T enum کی قسم ہے۔ یہ جاوا زبان میں تمام enum اقسام کے لیے ایک عام بیس کلاس سے زیادہ کچھ نہیں ہے۔ اینوم سے کلاس میں تبدیلی جاوا کمپائلر کے ذریعہ مرتب وقت پر کی جاتی ہے۔ توسیع کو کوڈ میں واضح طور پر اشارہ نہیں کیا گیا ہے، لیکن یہ ہمیشہ مضمر ہے۔

69. کیا اشیاء کی کسی مثال کے بغیر Enum بنانا ممکن ہے؟

یہ سوال قدرے الجھا ہوا ہے، اور مجھے یقین نہیں ہے کہ میں اسے پوری طرح سمجھتا ہوں۔ میرے پاس دو تشریحات ہیں: 1. کیا آپ بغیر کسی قدر کے اینوم رکھ سکتے ہیں ؟ ہاں، بالکل، لیکن یہ ایک خالی کلاس کی طرح ہوگا — بے معنی، جیسے
public enum Role {
}
اور اگر ہم کال کریں:
var s = Role.values();
System.out.println(s);
ہمیں کنسول میں درج ذیل چیزیں ملتی ہیں:
[Lflyweight.Role;@9f70c54
( رول ویلیوز کی ایک خالی صف) 2. کیا نئے آپریٹر کے بغیر اینوم بنانا ممکن ہے ؟ جی بلکل. جیسا کہ میں نے اوپر کہا، آپ enum اقدار کے لیے نئے آپریٹر کا استعمال نہیں کرتے ، کیونکہ وہ جامد قدریں ہیں۔

70. کیا ہم Enum کے toString() طریقہ کو اوور رائیڈ کر سکتے ہیں؟

ہاں، یقیناً آپ toString() طریقہ کو اوور رائڈ کر سکتے ہیں تاکہ یہ وضاحت کرنے کے لیے کہ toString طریقہ کو کال کرنے پر اپنے enum کو کیسے ظاہر کیا جائے (جب enum کو ایک عام سٹرنگ میں تبدیل کرنا، مثال کے طور پر، اسے کنسول یا لاگز میں آؤٹ پٹ کرنا)۔
public enum Role {
   STUDENT,
   TEACHER,
   DIRECTOR,
   SECURITY_GUARD;

   @Override
   public String toString() {
       return "Selected role - " + super.toString();
   }
}
آج میرے لیے اتنا ہی ہے۔ اگلے حصے تک!
مزید پڑھ:
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION