JavaRush /جاوا بلاگ /Random-UR /جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔ حص...

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

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

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

جاوا میں میموری میں (Heap، جس کے بارے میں ہم بعد میں بات کریں گے) ایک علاقہ ہے - String pool ، یا string pool. یہ سٹرنگ ویلیوز کو ذخیرہ کرنے کے لیے ڈیزائن کیا گیا ہے۔ دوسرے لفظوں میں، جب آپ ایک مخصوص سٹرنگ بناتے ہیں، مثال کے طور پر ڈبل کوٹس کے ذریعے:
String str = "Hello world";
یہ دیکھنے کے لیے چیک کیا جاتا ہے کہ آیا سٹرنگ پول میں دی گئی قدر ہے۔ اگر ایسا ہے تو، 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);
ہمیں دو غلط اقدار ملیں گی ، جس کا مطلب ہے کہ ہمارے یہاں تین مختلف اقدار ہیں جن کا حوالہ دیا جا رہا ہے۔ درحقیقت، یہی وجہ ہے کہ صرف ڈبل اقتباسات کا استعمال کرتے ہوئے سٹرنگ بنانے کی سفارش کی جاتی ہے۔ تاہم، آپ new کا استعمال کرتے ہوئے آبجیکٹ بناتے وقت سٹرنگ پول میں قدریں شامل کر سکتے ہیں (یا اس کا حوالہ حاصل کر سکتے ہیں) ۔ ایسا کرنے کے لیے، ہم string class کا طریقہ استعمال کرتے ہیں - intern() ۔ یہ طریقہ زبردستی سٹرنگ پول میں ایک ویلیو بناتا ہے، یا اگر وہ پہلے ہی وہاں محفوظ ہو تو اس کا لنک مل جاتا ہے۔ یہاں ایک مثال ہے:
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);
نتیجے کے طور پر، ہمیں کنسول میں تین حقیقی قدریں موصول ہوں گی ، جس کا مطلب ہے کہ تینوں متغیرات ایک ہی تار کا حوالہ دیتے ہیں۔جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 7 - 2

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

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

   public Lawyer() {
       System.out.println("Юрист взят в штат.");
   }

   @Override
   public void work() {
       System.out.println("Решение юридических вопросов...");
   }
}
اور اکاؤنٹنٹ:
public class Accountant implements Employee{

   public Accountant() {
       System.out.println("Бухгалтер взят в штат.");
   }

   @Override
   public void work() {
       System.out.println("Ведение бухгалтерского отчёта....");
   }
}
طریقے بہت مشروط ہیں: ہمیں صرف یہ دیکھنے کی ضرورت ہے کہ ان پر عمل کیا جاتا ہے۔ یہی صورت حال کنسٹرکٹر پر بھی لاگو ہوتی ہے۔ کنسول آؤٹ پٹ کا شکریہ، ہم دیکھیں گے کہ نئی اشیاء کب بنتی ہیں۔ ہمارے پاس ایک ملازم محکمہ بھی ہے، جس کا کام درخواست کردہ ملازم کو جاری کرنا ہے، اور اگر وہ وہاں نہیں ہے، تو اسے ملازمت پر رکھیں اور درخواست کے جواب میں جاری کریں:
public class StaffDepartment {
   private Map<String, Employee> currentEmployees = new HashMap<>();

   public Employee receiveEmployee(String type) throws Exception {
       Employee result;
       if (currentEmployees.containsKey(type)) {
           result = currentEmployees.get(type);
       } else {
           switch (type) {
               case "Бухгалтер":
                   result = new Accountant();
                   currentEmployees.put(type, result);
                   break;
               case "Юрист":
                   result = new Lawyer();
                   currentEmployees.put(type, result);
                   break;
               default:
                   throw new Exception("Данный сотрудник в штате не предусмотрен!");
           }
       }
       return result;
   }
}
یعنی، منطق سادہ ہے: اگر کوئی دی گئی اکائی ہے، تو اسے واپس کریں؛ اگر نہیں، تو اسے بنائیں، اسے ذخیرہ میں رکھیں (کیشے کی طرح) اور واپس دیں۔ اب دیکھتے ہیں کہ یہ سب کیسے کام کرتا ہے:
public static void main(String[] args) throws Exception {
   StaffDepartment staffDepartment = new StaffDepartment();
   Employee empl1  = staffDepartment.receiveEmployee("Юрист");
   empl1.work();
   Employee empl2  = staffDepartment.receiveEmployee("Бухгалтер");
   empl2.work();
   Employee empl3  = staffDepartment.receiveEmployee("Юрист");
   empl1.work();
   Employee empl4  = staffDepartment.receiveEmployee("Бухгалтер");
   empl2.work();
   Employee empl5  = staffDepartment.receiveEmployee("Юрист");
   empl1.work();
   Employee empl6  = staffDepartment.receiveEmployee("Бухгалтер");
   empl2.work();
   Employee empl7  = staffDepartment.receiveEmployee("Юрист");
   empl1.work();
   Employee empl8  = staffDepartment.receiveEmployee("Бухгалтер");
   empl2.work();
   Employee empl9  = staffDepartment.receiveEmployee("Юрист");
   empl1.work();
   Employee empl10  = staffDepartment.receiveEmployee("Бухгалтер");
   empl2.work();
}
اور کنسول میں، اس کے مطابق، ایک آؤٹ پٹ ہو گا:
وکیل کی خدمات حاصل کی گئی ہیں۔ قانونی مسائل کو حل کرنا... ایک اکاؤنٹنٹ کی خدمات حاصل کی گئی ہیں۔ اکاؤنٹنگ رپورٹ کو برقرار رکھنا .... قانونی مسائل کو حل کرنا ... اکاؤنٹنگ رپورٹ کو برقرار رکھنا .... قانونی مسائل کو حل کرنا ... اکاؤنٹنگ رپورٹ کو برقرار رکھنا .... قانونی مسائل کو حل کرنا ... اکاؤنٹنگ رپورٹ کو برقرار رکھنا .... قانونی مسائل کو حل کرنا... اکاؤنٹنگ رپورٹس کو برقرار رکھنا...
جیسا کہ آپ دیکھ سکتے ہیں، صرف دو اشیاء بنائی گئی تھیں، جنہیں کئی بار دوبارہ استعمال کیا گیا تھا۔ مثال بہت آسان ہے، لیکن یہ واضح طور پر ظاہر کرتی ہے کہ اس سانچے کا استعمال ہمارے وسائل کو کیسے بچا سکتا ہے۔ ٹھیک ہے، جیسا کہ آپ نے دیکھا، اس طرز کی منطق انشورنس پول کی منطق سے بہت ملتی جلتی ہے۔ آپ اس مضمون میں GOF پیٹرن کی اقسام کے بارے میں مزید پڑھ سکتے ہیں ۔جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 7 - 3

64۔ تار کو حصوں میں کیسے تقسیم کیا جائے؟ براہ کرم متعلقہ کوڈ کی مثال فراہم کریں۔

ظاہر ہے، یہ سوال تقسیم کے طریقہ کار کے بارے میں ہے ۔ اسٹرنگ کلاس میں اس طریقہ کی دو مختلف حالتیں ہیں:
String split(String regex);
اور
String split(String regex);
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 constraint کے لیے نہ ہوتا تو صف کے آخری عنصر کو تین ذیلی اسٹرنگ میں تقسیم کیا جا سکتا ہے۔جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 7 - 4

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

پاس ورڈ کو ذخیرہ کرتے وقت سٹرنگ پر صف کو ترجیح دینے کی کئی وجوہات ہیں: 1. سٹرنگ پول اور سٹرنگ کی تبدیلی۔ ایک صف استعمال کرتے وقت ( char[] )، ہم ڈیٹا کو مکمل کرنے کے بعد واضح طور پر مٹا سکتے ہیں۔ اس کے علاوہ، ہم جتنا چاہیں صف کو دوبارہ لکھ سکتے ہیں، اور درست پاس ورڈ سسٹم میں کہیں بھی نہیں ہوگا، یہاں تک کہ کوڑا اٹھانے سے پہلے (یہ کافی ہے کہ کچھ سیلز کو غلط اقدار میں تبدیل کر دیا جائے)۔ ایک ہی وقت میں، String ایک ناقابل تغیر کلاس ہے۔ یعنی اگر ہم اس کی قدر کو تبدیل کرنا چاہتے ہیں تو ہمیں ایک نیا ملے گا، جبکہ پرانا سٹرنگ پول میں ہی رہے گا۔ اگر ہم پاس ورڈ کی سٹرنگ ویلیو کو ہٹانا چاہتے ہیں تو یہ ایک بہت مشکل کام ہو سکتا ہے، کیونکہ ہمیں سٹرنگ پول سے ویلیو کو ہٹانے کے لیے کوڑا اٹھانے والے کی ضرورت ہے ، اور اس بات کا بہت زیادہ امکان ہے کہ یہ سٹرنگ ویلیو ایک کے لیے وہاں رہے گی۔ طویل وقت یعنی اس صورت حال میں، String ڈیٹا سٹوریج کی حفاظت کے لحاظ سے char array سے کمتر ہے۔ 2. اگر سٹرنگ ویلیو غلطی سے کنسول (یا لاگز) میں آؤٹ پٹ ہو جاتی ہے، تو قدر خود ظاہر ہو جائے گی:
String password = "password";
System.out.println("Пароль - " + password);
کنسول آؤٹ پٹ:
پاس ورڈ
ایک ہی وقت میں، اگر آپ غلطی سے کنسول میں ایک صف کو آؤٹ پٹ کرتے ہیں:
char[] arr = new char[]{'p','a','s','s','w','o','r','d'};
System.out.println("Пароль - " + arr);
کنسول میں ناقابل فہم gobbledygook ہو گا:
پاس ورڈ - [C@7f31245a
اصل میں gobbledygook نہیں، لیکن: [C کلاس کا نام ایک char array ہے ، @ ایک الگ کرنے والا ہے، اس کے بعد 7f31245a ایک ہیکساڈیسیمل ہیش کوڈ ہے۔ 3. سرکاری دستاویز، جاوا کرپٹوگرافی آرکیٹیکچر گائیڈ، واضح طور پر اسٹرنگ کے بجائے char[] میں پاس ورڈز کو ذخیرہ کرنے کا ذکر کرتی ہے : "جاوا .lang.String قسم کی کسی چیز میں پاس ورڈ جمع کرنا اور اسٹور کرنا منطقی لگتا ہے ۔ تاہم، یہاں ایک انتباہ موجود ہے: سٹرنگ آبجیکٹ ناقابل تغیر ہیں، یعنی اسٹرنگ آبجیکٹ کے مواد کو تبدیل کرنے (اوور رائٹ) یا استعمال کے بعد کالعدم کرنے کی اجازت دینے کے لیے کوئی طریقہ بیان نہیں کیا گیا ہے۔ یہ خصوصیت String اشیاء کو حساس معلومات جیسے کہ صارف کے پاس ورڈز کو ذخیرہ کرنے کے لیے غیر موزوں بناتی ہے۔ اس کے بجائے، آپ کو ہمیشہ حساس حفاظتی معلومات کو ایک کردار کی صف میں جمع اور ذخیرہ کرنا چاہیے۔جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 7 - 5

اینوم

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

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

67. کیا Enum انٹرفیس کو نافذ کر سکتا ہے؟

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

68. کیا Enum کلاس بڑھا سکتا ہے؟

نہیں، ایسا نہیں ہو سکتا، کیونکہ ایک 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 اقدار (enumerations) کے لیے استعمال کرنے کی ضرورت نہیں ہے ، کیونکہ یہ جامد قدریں ہیں۔

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

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

   @Override
   public String toString() {
       return "Выбрана роль - " + super.toString();
   }
}
آج کے لیے اتنا ہی ہے، اگلے حصے تک!جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 7 - 6
سیریز میں دیگر مواد:
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION