CodeGym /وبلاگ جاوا /Random-FA /بررسی پرسش ها و پاسخ های مصاحبه شغلی برای یک موقعیت توسعه...
John Squirrels
مرحله
San Francisco

بررسی پرسش ها و پاسخ های مصاحبه شغلی برای یک موقعیت توسعه دهنده جاوا. قسمت 2

در گروه منتشر شد
سلام مجدد به همه! ما همچنان به جستجوی پاسخ به سؤالات برای توسعه دهندگان جاوا سطح پایین، متوسط ​​و ارشد می پردازیم. سوالات فوق العاده جالب هستند من شخصاً تجزیه و تحلیل آنها را دوست دارم، زیرا به من کمک می کند شکاف هایی را در دانش نظری خود پیدا کنم و گاهی اوقات در غیر منتظره ترین مکان ها. قسمت قبلی را می توانید در این مقاله بررسی پرسش ها و پاسخ های مصاحبه شغلی برای یک موقعیت توسعه دهنده جاوا.  قسمت 2 - 1 بیابید . اما قبل از شروع، می خواهم به شما یادآوری کنم که:
  1. من از سوالاتی که با این سری مقالات همپوشانی دارند صرف نظر می کنم تا اطلاعات تکراری بی مورد انجام نشود. خواندن این مقالات را توصیه می کنم زیرا رایج ترین (محبوب ترین) سوالات مصاحبه Java Core را پوشش می دهند.
  2. می‌توانم پاسخ‌ها را با جزئیات بیشتری توضیح دهم، اما نمی‌کنم، زیرا در این صورت هر پاسخ می‌تواند برای کل مقاله طول بکشد. و هیچ کس در هر مصاحبه شغلی از شما این سطح از جزئیات را نمی خواهد.
اگر بخواهید لینک هایی برای مطالعه عمیق تر می گذارم. بیا پرواز کنیم!

11. همه متدهای کلاس Object را نام ببرید

کلاس Object 11 متد دارد:
  1. Class<?> getClass() - کلاس شی فعلی را دریافت کنید.

  2. int hashCode() - کد هش شی فعلی را دریافت کنید.

  3. بولی برابر است (Object obj) - شی فعلی را با یک شی دیگر مقایسه کنید.

  4. Object clone() - یک کپی از شی فعلی ایجاد و برگرداند.

  5. String toString() - نمایش رشته شی را دریافت کنید.

  6. void notify() - یک رشته در حال انتظار در مانیتور این شیء را بیدار کنید (انتخاب رشته تصادفی است).

  7. void notifyAll() - تمام رشته های منتظر در مانیتور این شی را بیدار می کند.

  8. void wait() - بگذارید رشته فعلی روی مانیتور فعلی منتظر بماند (رشته فعلی را مسدود کنید) تا زمانی که یک تماس notify یا NotifyAll رشته را بیدار کند (فقط در یک بلوک همگام‌سازی شده کار می‌کند).

  9. انتظار خالی (مدت زمان طولانی) - موضوع فعلی را روی مانیتور فعلی (در بلوک همگام سازی شده فعلی)، اما با یک مهلت زمانی برای خروج از حالت انتظار (یا دوباره، تا زمانی که یک تماس Notify یا NotifyAll رشته را بیدار کند) منتظر بمانید.

  10. انتظار خالی (تایم اوت طولانی، نانوهای داخلی) - این روش مانند روش قبلی است، اما با تایم اوت دقیق تر.

  11. void finalize() - این متد (در نهایت) قبل از حذف شی توسط زباله گرد فراخوانی می شود. برای پاکسازی منابع به دست آمده استفاده می شود.

برای استفاده صحیح از کدهای hashCode ، برابر ، کلون ، toString و نهایی کردن متدها، باید بر اساس ویژگی‌های وظیفه فعلی، آنها را لغو کرد.

12. تفاوت try-with-resources و try-catch-finally هنگام کار با منابع چیست؟

به طور معمول، هنگام استفاده از try-catch-finally ، بلوک نهایی برای بستن منابع استفاده می شود. جاوا 7 بیانیه جدید try-with-resources را معرفی می کند . مشابه این است که در نهایت برای آزاد کردن منابع تلاش کنید، اما فشرده تر و خواناتر است. بیایید به یاد بیاوریم که try-catch-در نهایت چگونه به نظر می رسد:

String text = "some text......";
BufferedWriter bufferedWriter = null;
try {
   bufferedWriter = new BufferedWriter(new FileWriter("someFileName"));
   bufferedWriter.write(text); 
} catch (IOException e) {
   e.printStackTrace();
} finally {
   try {
       bufferedWriter.close();
   } catch (IOException e) {
       e.printStackTrace();
   }
}
حالا بیایید این کد را بازنویسی کنیم، اما با استفاده از try-with-resources :

String text = "some text......";
try(BufferedWriter bufferedWriter =new BufferedWriter(new FileWriter("someFileName"))) {
   bufferedWriter.write(text);
} catch (IOException e) {
   e.printStackTrace();
}
حالا این تا حدودی ساده تر است، فکر نمی کنید؟ علاوه بر کد ساده تر، چند نکته دیگر نیز وجود دارد:
  1. در try-with-resources ، منابع اعلام شده در داخل پرانتز (منابعی که بسته خواهند شد) باید رابط AutoCloseable و متد () تنها آن را پیاده سازی کنند .

    روش بستن در یک بلوک نهایی ضمنی اجرا می‌شود ، در غیر این صورت، چگونه برنامه دقیقاً چگونه می‌تواند منبع را ببندد؟

    اما احتمالاً به ندرت پیاده سازی منابع و روش بسته شدن آنها را خواهید نوشت.

  2. بلوک ها به ترتیب زیر اجرا می شوند:

    1. بلوک سعی کنید .
    2. ضمنی در نهایت بلوک.
    3. بلوک catch که استثناهایی را که در مراحل قبلی رخ می‌دهند را می‌گیرد.
    4. صریح در نهایت بلوک.

    به عنوان یک قاعده، استثناهایی که در لیست پایین‌تر قرار می‌گیرند، مواردی که در بالاتر پرتاب می‌شوند را قطع می‌کنند.

تصور کنید که در نهایت از یک try-catch- استفاده می‌کنید و یک استثنا در بلوک try دریافت می‌کنید . سپس بلوک catch مشخص شده بلافاصله شروع به اجرا می‌کند، که در آن یک استثنا دیگر نوشته‌ایم (مثلاً با پیامی که خطا را با جزئیات بیشتر توضیح می‌دهد)، و شما می‌خواهید که متد این استثنا را به سمت بالا پرتاب کند. سپس بلوک نهایی اجرا می شود و یک استثنا نیز در آن پرتاب می شود. اما این بار متفاوت این روش در نهایت کدام یک از این دو استثنا را ایجاد می کند؟ استثنا پرتاب شده توسط بلوک نهایی ! اما اکنون به نکته دیگری در مورد تلاش با منابع رسیده ایم . بیایید در نظر بگیریم که آزمون با منابع در شرایط مشابه چگونه رفتار می کند. هنگامی که سعی می کنیم منابع را در متد close() ببندیم ، یعنی در بلوک نهایی ضمنی، یک استثنا در بلوک try دریافت می کنیم . بلوک catch کدام یک از این استثناها را می گیرد ؟ یکی که توسط بلوک try پرتاب می شود ! استثنا از بلوک نهایی ضمنی (از روش lost() ) نادیده گرفته می شود. این نادیده گرفتن استثناها را سرکوب استثنا نیز می گویند.

13. عملیات بیتی چیست؟

عملیات بیتی عملیات روی دنباله ای از بیت ها هستند. آنها شامل عملیات منطقی و شیفت های بیتی هستند. عملگرهای منطقی:
  • bitwise AND - مقادیر بیت را مقایسه می کند. هر بیتی که روی 0 تنظیم شود (نادرست) بیت مربوطه را در نتیجه 0 قرار می دهد. یعنی اگر بیتی در هر دو مقدار مقایسه شده 1 (درست) باشد، بیت حاصل نیز 1 خواهد بود.

    مشخص شده با AND یا &

    مثال: 10111101 و 01100111 = 00100101

  • bitwise OR - این عملیات برعکس عملیات قبلی است. هر بیتی که روی 1 تنظیم شود، بیت مربوطه را در نتیجه 1 قرار می دهد. بر این اساس، اگر بیت در هر دو مقدار مقایسه شده 0 باشد، بیت حاصل نیز 0 خواهد بود.

    با OR یا | مشخص می شود

    مثال: 10100101 | 01100011 = 11100111

  • bitwise NOT - این عملگر به یک مقدار اعمال می شود. بیت ها را ورق می زند (معکوس می کند). یعنی بیت هایی که 1 بودند تبدیل به 0 می شوند. و آنهایی که 0 بودند 1 می شوند.

    با NOT یا ~ مشخص می شود

    مثال: ~10100101 = 01011010

  • OR انحصاری bitwise - مقادیر بیت را مقایسه می کند. اگر هر دو بیت 1 باشند، بیت حاصل 0 است. اگر هر دو بیت 0 باشند، بیت حاصل 0 است. به عبارت دیگر، برای اینکه بیت حاصل 1 باشد، فقط یکی از بیت ها باید 1 باشد و بیت دیگر باید 0 باشد.

    با XOR یا ^ مشخص می شود

    مثال: 10100101 ^ 01100011 = 11000110

شیفت های بیتی ( >> و << ) بیت های عملوند را به تعداد مکان های مشخص شده در جهت مشخص شده جابجا می کنند. موقعیت های خالی با صفر پر می شوند. مثلا:
  1. 01100011 >> 4 = 00000110
  2. 01100011 << 3 = 00011000
استثنا زمانی است که یک عدد منفی را به سمت راست منتقل کنید. همانطور که به یاد دارید، اولین بیت از یک عدد امضا شده نشان دهنده علامت است. اگر این بیت 1 باشد، عدد منفی است. اگر یک عدد منفی را جابجا کنید، موقعیت های خالی با صفر پر نمی شوند، بلکه با یک ها پر می شوند، زیرا بیت علامت باید حفظ شود. به عنوان مثال: 10100010 >> 2 = 11101000 که گفته شد، جاوا دارای یک عملگر شیفت راست بدون علامت اضافی است (>>>). این عملگر مشابه >> است، اما وقتی جابجا می شود، موقعیت های خالی با 0 پر می شوند، صرف نظر از اینکه عملوند یک عدد منفی است یا یک عدد مثبت. به عنوان مثال: 10100010 >>> 2 = 00101000 اطلاعات بیشتر در مورد عملیات بیتی را در اینجا بخوانید . بررسی پرسش ها و پاسخ های مصاحبه شغلی برای یک موقعیت توسعه دهنده جاوا.  قسمت 2 - 2می توانید متد hash() را در HashMaps به عنوان نمونه ای از شیفت های بیتی در جاوا در نظر بگیرید. این روش برای تعیین کد هش کد داخلی ویژه کلید استفاده می شود: بررسی پرسش ها و پاسخ های مصاحبه شغلی برای یک موقعیت توسعه دهنده جاوا.  قسمت 2 - 3این روش به شما امکان می دهد داده ها را به طور مساوی در یک HashMap توزیع کنید تا تعداد برخوردها را به حداقل برسانید.

14. چه اشیا استاندارد تغییرناپذیری در جاوا وجود دارد؟

اگر یک شیء اجازه تغییر مقادیر اصلی خود را ندهد تغییر ناپذیر است. ممکن است متدهایی داشته باشد که اشیاء جدیدی از همان نوع را با مقادیر متفاوت برمی گرداند. برخی از اشیاء تغییرناپذیر استاندارد عبارتند از:
  • بدون شک، معروف ترین نوع تغییرناپذیر جاوا String است.
  • نمونه‌هایی از کلاس‌های wrapper که انواع استاندارد را پوشش می‌دهند: Boolean، Character، Byte، Short، Integer، Long، Double، Float.
  • اشیاء BigInteger و BigDecimal که معمولاً برای اعداد BIG استفاده می شوند.
  • اشیاء StackTraceElement که یک stack trace را می سازند (به عنوان مثال، stack trace یک استثنا).
  • یک شی از کلاس File - می تواند فایل ها را تغییر دهد، اما در عین حال خود شی بدون تغییر باقی می ماند.
  • UUID که اغلب برای شناسایی منحصر به فرد عناصر استفاده می شود.
  • تمام اشیاء کلاس ها در بسته java.time.
  • اشیاء محلی، که برای شناسایی یک منطقه جغرافیایی، سیاسی یا فرهنگی استفاده می شود.

15-مزایای جسم تغییرناپذیر نسبت به اجسام معمولی چیست؟

  1. اشیای تغییرناپذیر برای استفاده در محیط چند رشته ای ایمن هستند . آنها این کار را انجام می دهند تا دیگر نگران از دست دادن اطلاعات به دلیل شرایط مسابقه نباشید. این با زمانی که شما با اشیاء معمولی کار می کنید متفاوت است. در این صورت، هنگام استفاده از شیء در یک محیط موازی، باید فکر کنید و مکانیسم های خوبی ارائه دهید.

  2. اشیاء تغییرناپذیر به عنوان کلید در نقشه خوب هستند. اگر از یک شیء قابل تغییر به عنوان کلید HashMap استفاده کنید و سپس وضعیت شی تغییر کند، ساختار داده ممکن است گیج شود: شی همچنان وجود خواهد داشت، اما اگر از containKey() استفاده کنید، ممکن است آن را پیدا نکنید.

  3. اشیای تغییرناپذیر برای ذخیره داده های تغییرناپذیر (ثابت) عالی هستند که هرگز نباید در حین اجرای برنامه تغییر داده شوند.

  4. مزیت دیگر اتمی بودن شکست است. اگر یک شیء تغییرناپذیر یک استثنا پرتاب کند، در حالت ناخواسته (شکسته) باقی نمی ماند.

  5. این کلاس ها به راحتی قابل تست هستند.

  6. شما به هیچ مکانیزم اضافی مانند سازنده کپی یا اجرای شبیه سازی شی نیاز ندارید.

سوالات در مورد OOP

16. مزایای OOP به طور کلی و در مقایسه با برنامه نویسی رویه ای چیست؟

خوب، مزایای OOP:
  1. نوشتن برنامه های پیچیده با استفاده از OOP آسان تر از برنامه نویسی رویه ای است زیرا همه چیز به ماژول های کوچک تقسیم می شود - اشیایی که با یکدیگر تعامل دارند - و در نتیجه، برنامه نویسی به روابط بین اشیا کاهش می یابد.

  2. برنامه های نوشته شده با OOP بسیار ساده تر تغییر می کنند (زمانی که اصول طراحی به درستی رعایت شود).

  3. از آنجایی که هم داده ها و هم عملیات داده یک موجودیت واحد را تشکیل می دهند، آنها در سراسر برنامه لکه دار نمی شوند (که اغلب در برنامه نویسی رویه ای چنین است).

  4. اصل کپسوله سازی از حیاتی ترین داده ها از کاربر محافظت می کند.

  5. همان کد را می‌توان با داده‌های مختلف دوباره استفاده کرد، زیرا کلاس‌ها به شما اجازه می‌دهند تا اشیاء زیادی ایجاد کنید که هر کدام مقادیر خاص خود را دارند.

  6. وراثت و چندشکلی همچنین به شما امکان می دهد از کدهای موجود استفاده مجدد و گسترش دهید (به جای تکرار عملکردهای مشابه).

  7. گسترش یک برنامه کاربردی ساده تر از رویکرد رویه ای است.

  8. رویکرد OOP امکان انتزاع کردن جزئیات پیاده سازی را فراهم می کند.

17. به ما بگویید OOP چه معایبی دارد

متأسفانه آنها نیز وجود دارند:
  1. OOP به دانش نظری زیادی نیاز دارد که قبل از نوشتن هر چیزی باید تسلط داشته باشید.

  2. درک و کاربرد ایده های OOP چندان آسان نیست (شما باید در قلب کمی فیلسوف باشید).

  3. OOP به دلیل افزایش پیچیدگی سیستم، عملکرد یک برنامه را اندکی کاهش می دهد.

  4. رویکرد OOP به حافظه بیشتری نیاز دارد زیرا همه چیز از کلاس ها، رابط ها، متدها تشکیل شده است که حافظه بسیار بیشتری نسبت به متغیرهای معمولی اشغال می کنند.

  5. زمان مورد نیاز برای تحلیل اولیه بیشتر از یک رویکرد رویه ای است.

18. چندشکلی ایستا در مقابل چندشکلی پویا چیست؟

چند شکلی به اشیاء یک کلاس یا رابط اجازه می دهد تا رفتار متفاوتی داشته باشند. دو نوع پلی مورفیسم وجود دارد که به آنها پیوند زودرس و دیررس نیز می‌گویند. پلی مورفیسم ایستا یا اتصال اولیه:
  • در زمان کامپایل (در اوایل چرخه عمر برنامه) رخ می دهد.
  • تصمیم می گیرد که کدام متد را در زمان کامپایل اجرا کند.
  • روش اضافه بار نمونه ای از چند شکلی استاتیک است.
  • اتصال اولیه شامل روش های خصوصی، ایستا و نهایی است.
  • وراثت در اتصال اولیه دخیل نیست.
  • چند شکلی ایستا شامل اشیاء خاصی نمی شود، بلکه اطلاعاتی در مورد نوع کلاسی که در سمت چپ نام متغیر ظاهر می شود را شامل می شود.
پلی مورفیسم دینامیک یا اتصال دیرهنگام:
  • در زمان اجرا (در حالی که برنامه در حال اجرا است) رخ می دهد.
  • پلی مورفیسم پویا تصمیم می‌گیرد که یک روش در زمان اجرا کدام پیاده‌سازی خاص را داشته باشد.
  • نادیده گرفتن روش نمونه ای از چندشکلی پویا است.
  • late binding به معنای اختصاص دادن یک شی خاص، یک مرجع از نوع آن، یا سوپرکلاس آن است.
  • وراثت با پلی مورفیسم پویا همراه است.

19. تعریفی از اصل انتزاع در OOP ارائه دهید

در OOP، انتزاع راهی برای جداسازی مجموعه‌ای از ویژگی‌های معنادار یک شی است، در حالی که جزئیات بی‌اهمیت را حذف می‌کند. یعنی هنگام طراحی یک برنامه با رویکرد OOP، روی مدل های کلی تمرکز می کنید، بدون اینکه وارد جزئیات اجرای آنها شوید. در جاوا، انتزاع از طریق رابط ها تحقق می یابد . به عنوان مثال، شما یک ماشین دارید و آن یک رابط خواهد بود. و تعاملات مختلف با آن - به عنوان مثال، راه اندازی موتور، تعویض دنده ها - عملکردهایی هستند که ما بدون پرداختن به جزئیات پیاده سازی از آنها استفاده می کنیم. در واقع، وقتی در حال رانندگی هستید، دقیقاً به این فکر نمی‌کنید که گیربکس دقیقاً چگونه هدف خود را برآورده می‌کند، یا کلید چگونه موتور را روشن می‌کند، یا دقیقاً چگونه فرمان چرخ‌ها را می‌چرخاند. و اگر اجرای برخی از عملکردها (به عنوان مثال، موتور) را جایگزین کنید، ممکن است حتی متوجه آن نشوید. برای شما مهم نیست: شما به جزئیات پیاده سازی نمی پردازید. آنچه برای شما مهم است این است که عمل انجام شود. در اصل، این انتزاع کردن جزئیات پیاده سازی است. در این مرحله، امروز متوقف می شویم: ادامه دارد!
بیشتر بخوانید:
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION