JavaRush /وبلاگ جاوا /Random-FA /تجزیه و تحلیل پرسش و پاسخ از مصاحبه برای توسعه دهنده جاوا...

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

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

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

کلاس Object 11 متد دارد:
  • Class<?> getClass() - دریافت کلاس شی فعلی.
  • int hashCode() - دریافت کد هش شی فعلی.
  • بولی برابر است (ابجکت شی) - مقایسه شی فعلی با شی دیگر.
  • Object clone() - ایجاد و بازگرداندن یک کپی از شی فعلی.
  • String toString() - دریافت یک نمایش رشته ای از یک شی.
  • void notify() - بیدار کردن یک رشته در حال انتظار در مانیتور این شی (انتخاب رشته تصادفی است).
  • void notifyAll() - تمام رشته های منتظر روی مانیتور این شی را بیدار می کند.
  • void wait() - رشته فعلی را به حالت آماده به کار تغییر می‌دهد (آن را منجمد می‌کند) در مانیتور فعلی، فقط در یک بلوک همگام‌سازی شده کار می‌کند تا زمانی که برخی از آن‌ها را آگاه یا NotifyAll موضوع را بیدار کند.
  • انتظار خالی (مدت زمان طولانی) - همچنین رشته فعلی را در مانیتور فعلی (در مانیتور همگام فعلی) مسدود می کند، اما با یک تایمر برای خروج از این حالت (یا دوباره: تا زمانی که notify یا notifyAll بیدار شود).
  • انتظار خالی (تایم وقفه طولانی، نانوهای داخلی) - روشی مشابه روشی که در بالا توضیح داده شد، اما با تایمرهای دقیق تر برای خروج از انجماد.
  • void finalize() - قبل از حذف این شی، جمع کننده زباله این متد را فراخوانی می کند (در نهایت). برای پاکسازی منابع اشغال شده استفاده می شود.
برای استفاده صحیح از روش‌های hashCode ، برابر ، کلون ، toString و نهایی کردن، باید با در نظر گرفتن وظیفه و شرایط فعلی، دوباره تعریف شوند.

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

به طور معمول، هنگام استفاده از try-catch-finally، بلوک نهایی برای بستن منابع استفاده می شود. جاوا 7 نوع جدیدی از اپراتور try-with-resources را معرفی کرد ، مشابهی از try-catch-در نهایت برای آزاد کردن منابع، اما فشرده تر و خواناتر. بیایید به یاد بیاوریم که در نهایت 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 و تنها روش آن، close() را پیاده سازی کنند .

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

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

  2. دنباله اجرای بلوک:

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

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

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

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

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

    نشان داده شده به عنوان - و ، &

    مثال: 10111101 و 01100111 = 00100101

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

    نشان داده شده با - OR , |

    مثال: 10100101 | 01100011 = 11100111

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

    نشان داده شده به عنوان - NOT ، ~

    مثال: ~10100101 = 01011010

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

    نشان داده شده با - XOR ، ^

    مثال: 10100101 ^ 01100011 = 11000110

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

14. اشیاء در جاوا چه کلاس های غیرقابل تغییر استانداردی هستند؟

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

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

  1. چنین اشیایی هنگام استفاده در یک محیط چند رشته ای ایمن هستند . با استفاده از آنها، لازم نیست نگران از دست دادن اطلاعات به دلیل شرایط مسابقه نخ باشید. بر خلاف کار با اشیاء معمولی: در این مورد، شما باید بسیار با دقت فکر کنید و مکانیسم های استفاده از شی را در یک محیط موازی کار کنید.
  2. اشیاء غیرقابل تغییر کلیدهای خوبی در نقشه هستند، زیرا اگر از یک شیء قابل تغییر استفاده می کنید و سپس شیء حالت خود را تغییر می دهد، استفاده از HashMap می تواند باعث سردرگمی شود: شی همچنان وجود خواهد داشت، و اگر از containKey() استفاده کنید ، ممکن است وجود نداشته باشد. یافت.
  3. اشیای تغییرناپذیر برای ذخیره داده های تغییرناپذیر (ثابت) عالی هستند که هرگز نباید در حین اجرای برنامه تغییر داده شوند.
  4. "اتمی تا شکست" - اگر یک شیء تغییرناپذیر استثناء ایجاد کند، باز هم در حالت ناخواسته (شکسته) باقی نمی ماند.
  5. تست این کلاس ها آسان است.
  6. مکانیسم های اضافی مانند سازنده کپی و پیاده سازی کلون مورد نیاز نیست.

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

تجزیه و تحلیل سوالات و پاسخ های مصاحبه.  قسمت 2 - 4

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

بنابراین، مزایای OOP:
  1. نوشتن برنامه های پیچیده آسان تر از برنامه نویسی رویه ای است، زیرا همه چیز به ماژول های کوچک تقسیم می شود - اشیایی که با یکدیگر تعامل دارند - و در نتیجه، برنامه نویسی به روابط بین اشیا خلاصه می شود.
  2. برنامه‌هایی که با استفاده از OOP نوشته می‌شوند، بسیار ساده‌تر تغییر می‌کنند (تا زمانی که مفاهیم طراحی رعایت شود).
  3. از آنجایی که داده‌ها و عملیات روی آن یک موجودیت واحد را تشکیل می‌دهند، در سراسر برنامه لکه نمی‌شوند (که اغلب با برنامه‌نویسی رویه‌ای اتفاق می‌افتد).
  4. کپسوله سازی اطلاعات از حیاتی ترین داده ها از کاربر محافظت می کند.
  5. استفاده مجدد از همان کد با داده های مختلف امکان پذیر است، زیرا کلاس ها به شما اجازه می دهند تا اشیاء زیادی ایجاد کنید که هر کدام مقادیر مشخصه خود را دارند.
  6. وراثت و چندشکلی همچنین به شما امکان می دهد تا از کدهای موجود استفاده مجدد و گسترش دهید (به جای تکرار عملکردهای مشابه).
  7. توسعه آسان تر برنامه نسبت به رویکرد رویه ای.
  8. رویکرد OOP امکان انتزاع از جزئیات پیاده سازی را فراهم می کند.

17. به ما بگویید چه کاستی هایی در OOP وجود دارد

متأسفانه آنها نیز حضور دارند:
  1. OOP به دانش نظری زیادی نیاز دارد که قبل از اینکه بتوانید چیزی بنویسید باید تسلط داشته باشید.تجزیه و تحلیل سوالات و پاسخ های مصاحبه.  قسمت 2 - 5
  2. درک و کاربرد ایده های OOP چندان آسان نیست (شما باید در قلب کمی فیلسوف باشید).
  3. هنگام استفاده از OOP، به دلیل سازماندهی پیچیده تر سیستم، عملکرد نرم افزار کمی کاهش می یابد.
  4. رویکرد OOP به حافظه بیشتری نیاز دارد، زیرا همه چیز از کلاس ها، رابط ها، متدها تشکیل شده است که حافظه بسیار بیشتری نسبت به متغیرهای معمولی اشغال می کنند.
  5. زمان مورد نیاز برای تجزیه و تحلیل اولیه بیشتر از رویه ای است.

18. چندشکلی ایستا و پویا چیست

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

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

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