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

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

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

17. اختیاری کے کامیاب اور ناکام استعمال کی مثالیں دیں۔

فرض کریں کہ ہمارے پاس اقدار کی ایک خاص سیریز ہے جس کے ذریعے ہم سلسلہ سے گزرتے ہیں، اور آخر میں ہمیں نتیجہ کے طور پر کچھ اختیاری ملتا ہے:
Optional<String> stringOptional = Stream.of("a", "ab", "abc", "abcd")
   .filter(str -> str.length() >= 3)
   .findAny();
ہمیں، جیسا کہ توقع کی جاتی ہے، اس اختیاری سے قدر حاصل کرنے کی ضرورت ہے ۔ صرف get() کا استعمال ایک برا طریقہ ہے:
String result = stringOptional.get();
لیکن یہ طریقہ اختیاری سے قیمت حاصل کرکے ہمیں واپس کرنا ہے؟ یہ بلاشبہ درست ہے، لیکن اگر اس کے معنی ہیں۔ ٹھیک ہے، اگر سٹریم میں قدریں مختلف تھیں، اور آخر میں ہمیں ایک خالی اختیاری موصول ہوا، جب ہم get() طریقہ استعمال کرتے ہوئے اس سے قدر لینے کی کوشش کرتے ہیں ، تو درج ذیل کو پھینک دیا جائے گا: جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 16 - 2جو اچھا نہیں ہے۔ اس صورت میں، درج ذیل تعمیرات کا استعمال کرنا بہتر ہے:
  1. String result = null;
    if (stringOptional.isPresent()) {
     stringOptional.get();
    }

    اس صورت میں، ہم یہ چیک کر رہے ہیں کہ آیا عنصر اختیاری میں ہے یا نہیں ۔ اگر نہیں تو، نتیجے میں آنے والی تار کی پرانی قدر ہے۔

  2. String result = stringOptional.orElse("default value");

    اس صورت میں، ہم کچھ ڈیفالٹ قدر بتاتے ہیں، جو خالی اختیاری کی صورت میں نتیجے میں آنے والی سٹرنگ کو دی جائے گی ۔

  3. String result = stringOptional.orElseThrow(() -> new CustomException());

    اس صورت میں، ہم خود ایک استثناء دیتے ہیں جب اختیاری خالی ہو ۔

یہ کسی ایپلیکیشن میں آسان ہو سکتا ہے جب، مثال کے طور پر، Spring JPA طریقہ استعمال کیا جاتا ہے - findById() ، جو اختیاری قدریں لوٹاتا ہے۔ اس صورت میں، اس طریقہ کے ساتھ ہم قدر لینے کی کوشش کرتے ہیں، اور اگر یہ وہاں نہیں ہے، تو ہم کچھ رن ٹائم استثناء پھینک دیتے ہیں، جسے ExceptionHandler کا استعمال کرتے ہوئے کنٹرولر کی سطح پر پروسیس کیا جاتا ہے اور اسٹیٹس 404 - NOT FOUND کے ساتھ HTTP جواب میں تبدیل کیا جاتا ہے ۔ جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 16 - 3

18. کیا ایک اہم طریقہ کو حتمی قرار دینا ممکن ہے؟

ہاں، یقیناً، ہمیں main() طریقہ کو حتمی قرار دینے سے کوئی چیز نہیں روکتی ۔ مرتب کرنے والا غلطیاں پیدا نہیں کرے گا۔ لیکن یہ یاد رکھنے کے قابل ہے کہ کسی بھی طریقہ کو حتمی قرار دینے کے بعد وہ آخری طریقہ بن جائے گا - اوور رائڈ نہیں کیا جائے گا۔ حالانکہ، مین کی نئی تعریف کون کرے گا ؟؟؟ جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 16 - 4

19. کیا ایک ہی پیکج/کلاس کو دو بار درآمد کرنا ممکن ہے؟ اس کے کیا نتائج ہو سکتے ہیں؟

ہاں تم کر سکتے ہو. نتائج؟ ہمارے پاس کچھ غیر ضروری درآمدات ہوں گی جنہیں Intelijj IDEA گرے کے طور پر ظاہر کرے گا، یعنی غیر استعمال شدہ جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 16 - 5جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 16 - 6

20. کاسٹنگ کیا ہے؟ ہم ClassCastException کب حاصل کر سکتے ہیں؟

کاسٹنگ، یا ٹائپ کاسٹنگ ، ایک ڈیٹا کی قسم کو دوسرے ڈیٹا کی قسم میں تبدیل کرنے کا عمل ہے: دستی طور پر (مضمون کاسٹنگ) یا خودکار طور پر (واضح قسم کاسٹنگ)۔ جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 16 - 7خودکار تبدیلی کمپائلر کے ذریعے کی جاتی ہے، اور دستی تبدیلی ڈویلپر کے ذریعے کی جاتی ہے۔ قدیم اور کلاسوں کے لیے ٹائپ کاسٹنگ کچھ مختلف ہے، اس لیے ہم ان پر الگ سے غور کریں گے۔ قدیم اقسام قدیم اقسام کی خودکار کاسٹنگ کی ایک مثال :
int value = 17;
double convertedValue = value;
جیسا کہ آپ دیکھ سکتے ہیں، یہاں = نشان کے علاوہ کسی اضافی ہیرا پھیری کی ضرورت نہیں ہے۔ قدیم اقسام کی دستی کاسٹنگ کی مثال :
double value = 17.89;
int convertedValue = (int)value;
اس صورت میں، ہم ایک دستی کاسٹ کا مشاہدہ کر سکتے ہیں، جو (int) کا استعمال کرتے ہوئے لاگو کیا جاتا ہے ، جس کے تحت کوما کے بعد کا حصہ ضائع کر دیا جائے گا اور کنورٹڈ ویلیو کی قیمت - 17 ہوگی۔ اس مضمون میں قدیم اقسام کاسٹ کرنے کے بارے میں مزید پڑھیں ۔ ٹھیک ہے، اب اشیاء کی طرف چلتے ہیں۔ حوالہ جات کی اقسام حوالہ جات کی اقسام کے لیے، خودکار کاسٹنگ ڈیسنڈنٹ کلاسز سے پیرنٹ کلاسز کے لیے ممکن ہے۔ اسے پولیمورفزم بھی کہا جاتا ہے ۔ ہم کہتے ہیں کہ ہمارے پاس شیر کی کلاس ہے جو بلی کی کلاس سے وراثت میں ملتی ہے ۔ اس صورت میں، خودکار تبدیلی اس طرح نظر آئے گی:
Cat cat = new Lion();
لیکن ایک واضح کاسٹ کے ساتھ ، سب کچھ کچھ زیادہ ہی پیچیدہ ہے، کیونکہ اس میں زیادہ کو ختم کرنے کے لیے کوئی فعالیت نہیں ہے، جیسا کہ قدیم کی طرح۔ اور صرف فارم کی واضح تبدیلی کرنا:
Lion lion= (Lion)new Cat();
آپ کو ایک خرابی ملے گی: جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 16 - 8درحقیقت، آپ شیر کی نسل کے طبقے میں ایسے طریقے شامل کر سکتے ہیں جو اصل میں Cat کلاس میں نہیں تھے ، اور پھر انہیں کال کرنے کی کوشش کریں، کیونکہ آپ کی آبجیکٹ کی قسم Lion بن جائے گی ۔ ویسے اس میں کوئی منطق نہیں ہے۔ لہذا، قسم کی تنگی صرف اس صورت میں ممکن ہے جب اصل چیز شیر کی قسم کی تھی لیکن بعد میں اسے پیرنٹ کلاس میں ڈال دیا گیا تھا:
Lion lion = new Lion();
Cat cat = lion;
Lion newLion = (Lion)cat;
نیز، زیادہ وشوسنییتا کے لیے، instanceOf construct کا استعمال کرتے ہوئے اشیاء کے لیے ایک تنگ کاسٹ کی سفارش کی جاتی ہے ۔
if (cat instanceof Lion) {
 newLion = (Lion)new Cat();
}
اس مضمون میں حوالہ کی قسم کے بارے میں مزید پڑھیں ۔

21. جدید فریم ورک بنیادی طور پر صرف غیر چیک شدہ مستثنیات کیوں استعمال کرتے ہیں؟

میرے خیال میں یہ سب کچھ اس لیے ہے کیونکہ چیک شدہ استثناء کو ہینڈل کرنا اب بھی اسپگیٹی کوڈ ہے جو ہر جگہ دہرایا جاتا ہے، لیکن تمام معاملات میں اس کی واقعی ضرورت نہیں ہے۔ جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 16 - 9اس طرح کے معاملات میں، فریم ورک کے اندر پروسیسنگ کرنا آسان ہے، تاکہ اسے ایک بار پھر ڈویلپرز کے کندھوں پر منتقل نہ کیا جائے۔ ہاں، بلاشبہ، ایک ہنگامی صورت حال پیدا ہو سکتی ہے، لیکن ان ہی غیر چیک شدہ استثناء کو زیادہ آسان طریقے سے سنبھالا جا سکتا ہے، بغیر کوشش کے عمل میں پروسیسنگ کی زحمت کیے بغیر اور طریقوں سے آگے بڑھے بغیر۔ یہ صرف استثناء کو کچھ HTTP ردعمل میں تبدیل کرنے کے لئے کافی ہے exceptionHandler ۔

22. جامد درآمد کیا ہے؟

جامد ڈیٹا (طریقے، متغیرات) کا استعمال کرتے وقت، آپ آبجیکٹ کو خود نہیں بنا سکتے، بلکہ اسے کلاس کے نام سے کر سکتے ہیں، لیکن اس صورت میں بھی ہمیں کلاس کا لنک درکار ہے۔ اس کے ساتھ سب کچھ آسان ہے: اسے باقاعدہ درآمد کا استعمال کرتے ہوئے شامل کیا جاتا ہے۔ لیکن کیا ہوگا اگر ہم کلاس کا نام لکھے بغیر ایک جامد طریقہ استعمال کریں، جیسا کہ یہ موجودہ کلاس کا جامد طریقہ ہے؟ یہ جامد درآمد کے ساتھ ممکن ہے! اس صورت میں، ہمیں جامد امپورٹ اور اس طریقہ کا لنک لکھنا چاہیے۔ اس طرح، مثال کے طور پر، کوزائن ویلیو کا حساب لگانے کے لیے ریاضی کی کلاس کا ایک جامد طریقہ:
import static java.lang.Math.cos;
نتیجے کے طور پر، ہم کلاس کا نام بتائے بغیر طریقہ استعمال کر سکتے ہیں:
double result = cos(60);
ہم static import کا استعمال کرتے ہوئے ایک ہی وقت میں کلاس کے تمام جامد طریقے لوڈ کر سکتے ہیں:
import static java.lang.Math.*;
جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 16 - 10

23. hashCode() اور equals() طریقوں کے درمیان کیا تعلق ہے؟

اوریکل کے مطابق ، اصول یہ ہے کہ: اگر دو اشیاء برابر ہیں (یعنی equals() طریقہ واپس آتا ہے true )، تو ان کے پاس ایک ہی ہیش کوڈ ہونا چاہیے۔ ایک ہی وقت میں، یہ نہ بھولیں کہ دو مختلف اشیاء میں ایک ہی ہیش کوڈ ہو سکتا ہے۔ یہ سمجھنے کے لیے کہ Equals() اور hashCode() ہمیشہ جوڑوں میں کیوں اوور رائڈ ہوتے ہیں، درج ذیل صورتوں پر غور کریں:
  1. دونوں طریقے اوور رائڈ ہیں۔

    اس صورت میں ، ایک ہی اندرونی حالتوں کے ساتھ دو مختلف اشیاء درست ہو جائیں گی جب برابر () ، جبکہ hashCode() دونوں ایک ہی نمبر واپس کریں گے۔

    یہ پتہ چلتا ہے کہ سب کچھ ٹھیک ہے، کیونکہ اصول کی پیروی کی جا رہی ہے.

  2. دونوں طریقے اوور رائڈ نہیں ہیں۔

    اس صورت میں، ایک ہی اندرونی حالتوں کے ساتھ دو مختلف اشیاء غلط ہو جائیں گی جب equals() ، کیونکہ موازنہ == آپریٹر کے ذریعے حوالہ سے ہوتا ہے ۔

    hashCode() طریقہ مختلف قدریں بھی واپس کرے گا (زیادہ تر امکان ہے) کیونکہ یہ میموری لوکیشن ایڈریس کی تبدیل شدہ قدر پیدا کرتا ہے۔ لیکن ایک ہی آبجیکٹ کے لیے یہ ویلیو ایک جیسی ہو گی، بالکل اسی طرح جیسے equals() اس معاملے میں صحیح تب ہی واپس آئے گا جب حوالہ جات ایک ہی چیز کی طرف اشارہ کرتے ہیں۔

    معلوم ہوا کہ اس صورت میں سب کچھ ٹھیک ہے اور قاعدہ پورا ہو گیا ہے۔

  3. Overridden equals() ، overridden hashCode() نہیں ۔

    اس صورت میں، ایک ہی اندرونی حالتوں والی دو مختلف اشیاء کے لیے، equals() واپس آئے گا true ، اور hashCode() واپس آئے گا (زیادہ تر ممکنہ طور پر) مختلف اقدار۔

    یہ اصول کی خلاف ورزی ہے، لہذا ایسا کرنے کی سفارش نہیں کی جاتی ہے۔

  4. equals() اوور رائڈ نہیں ہے ، hashCode() اوور رائڈ ہے ۔

    اس صورت میں، ایک ہی اندرونی حالتوں کے ساتھ دو مختلف اشیاء کے لیے، equals() غلط لوٹائے گا اور hashCode() ایک جیسی اقدار واپس کرے گا۔

    قاعدہ کی خلاف ورزی ہے، لہذا نقطہ نظر غلط ہے۔

جیسا کہ آپ دیکھ سکتے ہیں، قاعدہ صرف اسی صورت میں عمل میں لایا جا سکتا ہے جب equals() اور hashCode() دونوں کو اوور رائڈ کیا گیا ہو یا دونوں ہی اوور رائڈ نہ ہوں۔ اس مضمون میں equals() اور hashCode()جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 16 - 11 کے بارے میں مزید پڑھیں ۔

24. BufferedInputStream اور BufferedOutputStream کلاسز کب استعمال ہوتی ہیں؟

ان پٹ اسٹریم کا استعمال کچھ وسائل سے ڈیٹا بائٹ بائٹ پڑھنے کے لیے کیا جاتا ہے، اور آؤٹ پٹ اسٹریم ڈیٹا بائٹ بائی بائٹ لکھنے کے لیے استعمال ہوتا ہے۔ لیکن بائٹ بائٹ آپریشنز بہت تکلیف دہ ہوسکتے ہیں اور اضافی پروسیسنگ کی ضرورت ہوتی ہے (متن کو عام طور پر پڑھنے/لکھنے کے لیے)۔ دراصل، اس طرح کے بائٹ ریکارڈ کو آسان بنانے کے لیے، BufferedOutputStream کو متعارف کرایا گیا تھا ، اور BufferedInputStream کو پڑھنے کے لیے متعارف کرایا گیا تھا ۔ یہ کلاسیں بفرز سے زیادہ کچھ نہیں ہیں جو ڈیٹا اکٹھا کرتے ہیں، جس سے آپ ڈیٹا کے ساتھ بائٹ بائٹ نہیں بلکہ پورے ڈیٹا پیکٹ (اریز) کے ساتھ کام کر سکتے ہیں۔ بن جانے پر، BufferedInputStream اپنے کنسٹرکٹر میں InputStream قسم کی ایک مثال لیتا ہے ، جس سے ڈیٹا پڑھا جاتا ہے:
BufferedInputStream bufferedInputStream = new BufferedInputStream(System.in);
byte[] arr = new byte[100];
bufferedInputStream.read(arr);
System.in ایک InputStream آبجیکٹ ہے جو کنسول سے ڈیٹا پڑھتا ہے۔ یعنی، اس BufferedInputStream آبجیکٹ کا استعمال کرتے ہوئے ، ہم ان پٹ اسٹریم سے ڈیٹا کو پاس کردہ صف میں لکھ کر پڑھ سکتے ہیں۔ یہ InputStream کلاس کا ایک قسم کا ریپر نکلا ہے ۔ اس مثال سے arr array وہ صف ہے جو BufferedInputStream سے ڈیٹا وصول کرتی ہے ۔ یہ، بدلے میں، ان پٹ اسٹریم سے ڈیٹا کو ایک اور صف کے ساتھ پڑھتا ہے، جس کا سائز بطور ڈیفالٹ 2048 بائٹس ہوتا ہے۔ یہی بات BufferedOutputStream کے لیے بھی درست ہے : OutputStream قسم کی ایک مثال کنسٹرکٹر کے پاس ہونی چاہیے ، جس میں ہم پوری صفوں میں ڈیٹا لکھیں گے۔
byte[] arr = "Hello world!!!".getBytes();
BufferedOutputStream bufferedInputStream = new BufferedOutputStream(System.out);
bufferedInputStream.write(arr);
bufferedInputStream.flush();
System.out ایک آؤٹ پٹ اسٹریم آبجیکٹ ہے جو کنسول میں ڈیٹا لکھتا ہے۔ flush() طریقہ BufferedOutputStream سے ڈیٹا کو OutputStream کو بھیجتا ہے ، اس عمل میں BufferedOutputStream کو فلش کرتا ہے ۔ اس طریقہ کے بغیر، کچھ بھی ریکارڈ نہیں کیا جائے گا. اور پچھلی مثال کی طرح: arr وہ صف ہے جس سے ڈیٹا BufferedOutputStream پر لکھا جاتا ہے ۔ وہاں سے وہ آؤٹ پٹ اسٹریم پر ایک مختلف صف میں لکھے جاتے ہیں، جس کا سائز بطور ڈیفالٹ 512 بائٹس ہوتا ہے۔ مضمون میں ان دو کلاسوں کے بارے میں مزید پڑھیں ۔

25. java.util.Collection اور java.util.Collections کلاسز میں کیا فرق ہے؟

مجموعہ ایک انٹرفیس ہے جو مجموعہ کے درجہ بندی کا سربراہ ہے۔ اس میں ایسی کلاسیں متعارف کرائی گئی ہیں جو آپ کو اشیاء کے پورے گروپس کو بنانے، ان پر مشتمل اور ان میں ترمیم کرنے کی اجازت دیتی ہیں۔ اس کے لیے بہت سے طریقے فراہم کیے گئے ہیں، جیسے add() ، remove() ، contains() اور دیگر۔ کلیکشن کلاس کے اہم انٹرفیس :
  • سیٹ ایک انٹرفیس ہے جو ایک سیٹ کی وضاحت کرتا ہے جس میں غیر ترتیب شدہ منفرد (غیر دہرائے جانے والے) عناصر ہوتے ہیں۔

  • فہرست ایک انٹرفیس ہے جو ڈیٹا ڈھانچے کی وضاحت کرتا ہے جو اشیاء کی ترتیب شدہ ترتیب کو محفوظ کرتا ہے۔ ان اشیاء کو اپنا انڈیکس (نمبر) ملتا ہے، جس کا استعمال کرتے ہوئے آپ ان کے ساتھ تعامل کر سکتے ہیں: لیں، حذف کریں، تبدیل کریں، اوور رائٹ کریں۔

  • قطار ایک انٹرفیس ہے جو ایک قطار کی شکل میں عناصر کو ذخیرہ کرنے والے ڈیٹا ڈھانچے کی وضاحت کرتا ہے جو کہ FIFO - First In First Out ۔

جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 16 - 12مجموعہ کے بارے میں مزید پڑھیں ۔ مجموعے ایک افادیت کی کلاس ہے جو بہت سے مختلف افادیت کے طریقے مہیا کرتی ہے۔ مثال کے طور پر:
  • addAll(Collection<? super T> collection, T...element) - T قسم کے پاس شدہ عناصر کو مجموعہ میں شامل کرتا ہے ۔

  • copy(List<? super T> dest، List<? extensions T> src) - فہرست src سے تمام عناصر کو dest میں فہرست میں کاپی کرتا ہے ۔

  • emptyList() - ایک خالی فہرست لوٹاتا ہے۔

  • max(Collection<? extends T> collection, Comparator<? super T> comp) - مخصوص کمپیریٹر کی طرف سے متعین کردہ ترتیب کے مطابق دیے گئے مجموعہ کا زیادہ سے زیادہ عنصر لوٹاتا ہے۔

  • unmodifiableList(List<? extensions T> list) - منظور شدہ فہرست کی ناقابل ترمیم نمائندگی لوٹاتا ہے۔

اور کلیکشنز میں اس طرح کے بہت سے مختلف آسان طریقے موجود ہیں ۔ جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 16 - 13ان طریقوں کی مکمل فہرست اوریکل ویب سائٹ پر دیکھی جا سکتی ہے ۔ یہ کچھ بھی نہیں ہے کہ میں نے کہا کہ وہ آرام دہ ہیں. سب کے بعد، وہ سب جامد ہیں. یعنی آپ کو ہر بار اس کلاس کی کوئی چیز بنانے کی ضرورت نہیں ہے تاکہ اس پر ضروری طریقہ کو کال کریں۔ آپ کو صرف کلاس کا نام درج کرنے کی ضرورت ہے، اس پر مطلوبہ طریقہ کو کال کریں اور تمام مطلوبہ دلائل پاس کریں۔ خلاصہ کرنے کے لیے، مجموعہ جمع کرنے کے فریم ورک کا بنیادی انٹرفیس ہے۔ کلیکشنز مجموعوں کے ڈھانچے سے کسی قسم سے تعلق رکھنے والی اشیاء کی زیادہ آسان پروسیسنگ کے لیے ایک مددگار کلاس ہے۔ ٹھیک ہے، یہ سب آج کے لئے ہے. اللہ بہلا کرے!جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 16 - 14
سیریز میں دیگر مواد:
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION