-
یک مقاله عالی با سوالات و پاسخ های برتر برای آنها وجود دارد . برخی از سوالات با لیست ارائه شده در بالا (250+) همپوشانی دارند، بنابراین از این سوالات صرفنظر می شود تا دوباره اطلاعات تکراری نشود.
-
سوالات به زبان اوکراینی ارائه شده است، اما از آنجایی که اکثر شرکت کنندگان JavaRush روسی زبان هستند (و تا حد زیادی من نیز)، پاسخ ها به زبان روسی خواهد بود.
-
پاسخ ها مختصر خواهد بود، زیرا اگر با جزئیات کامل بنویسید، پاسخ به برخی از سوالات ممکن است نیاز به مقاله جداگانه ای داشته باشد. و در طول مصاحبه ها، به چنین پاسخ های مفصل و حجیمی نیازی نیست، زیرا مصاحبه کننده شما فقط یک ساعت فرصت دارد تا با شما در مورد موضوعات ضروری مصاحبه کند (و همانطور که به یاد دارید، کافی است). برای کسانی که دوست دارند عمیق تر کاوش کنند، لینک ها را می گذارم.
پرسش و پاسخ سطح نوجوانان
مسائل کلی
1. چه الگوهای طراحی را می شناسید؟ از دو قالبی که در کار خود استفاده کرده اید بگویید.
قالب ها بسیار متنوع هستند: می توانید از این مقاله و این مقاله با آنها آشنا شوید. خوب، برای کسانی از شما که می خواهید با آنها به طور مفصل آشنا شوید، خواندن کتاب «اول سر. الگوهای طراحی" . با کمک آن می توانید ابتدایی ترین الگوهای طراحی را با جزئیات و به روشی آسان مطالعه کنید. وقتی صحبت از الگوهای طراحی می شود که می توانید از آنها به عنوان نمونه در مصاحبه استفاده کنید، برخی از آنها به ذهن می رسد:- Builder یک الگوی پرکاربرد است که جایگزینی برای ایجاد شیء کلاسیک است.
- الگوی استراتژی ، که ذاتاً نشان دهنده چندشکلی است. یعنی ما یک رابط داریم، اما رفتار برنامه بسته به اینکه چه پیاده سازی خاصی از این رابط به عملکرد منتقل شده است تغییر می کند (اکنون این استراتژی عملاً در همه جا در برنامه های جاوا استفاده می شود).
- Factory - در ApplicationContext (یا در BeanFactory)؛
- Singleton - همه لوبیاها به طور پیش فرض تک تن هستند.
- پروکسی - اساساً همه چیز در بهار از این الگو به روشی استفاده می کند ، به عنوان مثال ، AOP.
- زنجیره مسئولیت الگویی است که بر اساس مفهوم Spring Security کار می کند.
- الگو - مورد استفاده در Spring Jdbc.
جاوا هسته
2. چه نوع داده ای در جاوا وجود دارد؟
جاوا دارای انواع داده های اولیه است:- بایت - اعداد صحیح در محدوده -128 تا 127، وزن 1 بایت.
- کوتاه - اعداد صحیح در محدوده -32768 تا 32767، وزن 2 بایت.
- int — اعداد صحیح -2147483648 تا 2147483647، وزن آن 4 بایت است.
- طولانی — اعداد صحیح در محدوده 9223372036854775808 تا 9223372036854775807، وزن 8 بایت؛
- float — اعداد ممیز شناور در محدوده -3.4E+38 تا 3.4E+38، وزن آن 4 بایت است.
- دوگانه - اعداد ممیز شناور در محدوده -1.7E+308 تا 1.7E+308، وزن 8 بایت.
- char - تک کاراکتر در UTF-16، وزن 2 بایت.
- مقادیر بولی true/false ، وزن 1 بایت دارد.
3. یک شی چه تفاوتی با انواع داده های اولیه دارد؟
تفاوت اول: مقدار حافظه اشغال شده: اولیه ها خیلی کم را اشغال می کنند، زیرا فقط حاوی مقدار خودشان هستند، در حالی که اشیا می توانند مقادیر بسیار بسیار متفاوتی داشته باشند: هم اولیه و هم ارجاع به اشیاء دیگر. تفاوت دوم: جاوا یک زبان شی گرا است، بنابراین همه چیز در آن از طریق تعامل بین اشیاء کار می کند، و ابتدایی ها خیلی خوب جا نمی شوند (در واقع، به همین دلیل است که جاوا یک زبان 100٪ شی گرا نیست). سوم، به دنبال مورد دوم: از آنجایی که جاوا بر تعامل بین اشیاء متمرکز است، این اشیا مکانیسم های مختلفی برای مدیریت آنها دارند. به عنوان مثال، سازنده ها، متدها، استثناها (که عمدتاً روی اشیاء عمل می کنند) و غیره. در واقع، برای اینکه بدوی ها بتوانند به نوعی در این محیط شی گرا درگیر شوند (کار کنند)، wrapper ها برای انواع اولیه ( عدد صحیح ، کاراکتر ، دوگانه ، بولی ...) اختراع شدند.4-تفاوت بین ارسال پارامترها توسط مرجع و مقدار چیست؟
فیلدهای اولیه مقدار خود را ذخیره می کنند: برای مثال، اگر int i = 9 را تنظیم کنیم . فیلد i مقدار 9 را ذخیره می کند . وقتی به یک شی ارجاع داریم، به این معنی است که یک فیلد با ارجاع به شی یا به عبارت دیگر با مقدار آدرس شی در حافظه داریم.Cat cat = new Cat();
به نظر می رسد که فیلدهایی با ارجاع به یک شی نیز مقادیر ، مقادیر آدرس حافظه را ذخیره می کنند. یعنی cat مقدار آدرس شی جدید Cat() را در حافظه ذخیره می کند. وقتی پارامتری را به یک متد ارسال می کنیم، مقدار آن کپی می شود. در مورد اولیه، مقدار اولیه کپی می شود. بر این اساس، این روش با یک کپی کار می کند، که تغییر آن بر روی نسخه اصلی تأثیر نمی گذارد. در مورد نوع مرجع، مقدار آدرس حافظه به ترتیب کپی می شود، آدرس همان شیئی است که به آن اشاره می کند. و اگر شیء را با استفاده از این پیوند جدید تغییر دهیم، برای قدیمی تغییر خواهد کرد (در نهایت هر دو به یک شی اشاره می کنند).
5. JVM، JDK، JRE چیست؟
JVM - ماشین مجازی جاوا یک ماشین مجازی است که بایت کد جاوا را اجرا می کند که از قبل توسط کامپایلر تولید شده است. JRE - Java Runtime Environment - اساساً محیطی برای اجرای برنامه های کاربردی جاوا است که شامل JVM ، کتابخانه های استاندارد و سایر مؤلفه ها برای اجرای اپلت ها و برنامه های کاربردی نوشته شده به زبان برنامه نویسی جاوا است. به عبارت دیگر ، JRE بسته ای از همه چیزهایی است که برای اجرای یک برنامه جاوا کامپایل شده لازم است، اما حاوی ابزارها و ابزارهایی مانند کامپایلر یا دیباگر برای توسعه برنامه نیست. JDK - کیت توسعه جاوا - مجموعه ای گسترده از JRE ، یعنی محیطی نه تنها برای راه اندازی، بلکه برای توسعه برنامه های جاوا. JDK شامل همه چیزهایی است که در JRE وجود دارد، به علاوه ابزارهای مختلف اضافی - کامپایلرها و اشکال زدایی که برای ایجاد برنامه های کاربردی در جاوا مورد نیاز هستند (همچنین حاوی اسناد جاوا است).6. چرا از JVM استفاده کنیم؟
همانطور که در بالا ذکر شد، ماشین مجازی جاوا یک ماشین مجازی است که بایت کد جاوا را اجرا می کند که از قبل توسط کامپایلر تولید شده است. یعنی JVM کد منبع جاوا را درک نمی کند. بنابراین، ابتدا فایلهای java کامپایل میشوند که پس از کامپایل از قبل پسوند کلاس . دارند و در قالب همان کد بایتی ارائه میشوند که JVM میفهمد. هر سیستم عامل JVM خود را دارد، بنابراین با دریافت فایل های بایت کد، JVM آن را اجرا می کند و آن را با سیستم عاملی که در آن اتفاق می افتد تطبیق می دهد. در واقع، به دلیل JVM های مختلف، نسخه های JDK (یا JRE) برای سیستم عامل های مختلف متفاوت است (هر کدام از آنها به JVM خود نیاز دارند). بیایید به یاد بیاوریم که توسعه در سایر زبان های برنامه نویسی چگونه کار می کند. شما یک برنامه را توسعه می دهید، سپس کد آن به کد ماشین برای یک سیستم عامل خاص کامپایل می شود و سپس می توانید آن را اجرا کنید. به عبارت دیگر، شما باید نسخه های مختلفی از برنامه را برای هر سیستم بنویسید. در حالی که در جاوا، به لطف پردازش کد دوگانه (تجمیع و پردازش بایت های کد JVM)، می توانید از مزایای کراس پلتفرم بهره مند شوید. ما یک بار کد را ایجاد کردیم، آن را دوباره به کد بایت کامپایل کردیم، آن را به هر سیستم عاملی منتقل کردیم و JVM محلی کد را اجرا می کند. این ویژگی افسانه ای جاوا است - یک بار بنویس، هر جا اجرا شود . در مقاله " کامپایل و اجرای برنامه های جاوا زیر هود " در این مورد بیشتر بخوانید.7. بایت کد چیست؟
همانطور که در بالا گفتم، کامپایلر کد جاوا را به بایت کد میانی (فایل هایی با پسوند java. به فایل هایی با پسوند .class) تبدیل می کند. بایت کد از بسیاری جهات شبیه به کد ماشین است، فقط از مجموعه ای از دستورالعمل ها نه از یک پردازنده واقعی، بلکه از یک پردازنده مجازی استفاده می کند. علاوه بر این، ممکن است شامل بخشهایی باشد که بر استفاده از یک کامپایلر JIT متمرکز شده است، که اجرای دستورات را برای پردازنده واقعی که برنامه روی آن اجرا میشود بهینه میکند. کامپایل JIT که به آن کامپایل on-the-fly نیز گفته می شود، فناوری است که عملکرد یک برنامه را با استفاده از بایت کد با کامپایل کردن بایت کد در ماشین یا فرمت دیگری در حین اجرای برنامه افزایش می دهد. همانطور که ممکن است حدس بزنید، JVM هنگام اجرای بایت کد از یک کامپایلر JIT استفاده می کند. بیایید به یک مثال بایت کد نگاهی بیندازیم: خیلی خوانا نیست، درست است؟ خوب، این یک دستورالعمل برای ما نیست، بلکه برای JVM است. در اینجا مقاله ای وجود دارد که به شما در درک بهتر این موضوع کمک می کند.8. ویژگی های JavaBean چیست؟
JavaBeans یک کلاس جاوا با قوانین خاصی است. در اینجا چند قانون برای نوشتن JavaBean وجود دارد :-
کلاس باید حاوی یک سازنده دسترسی عمومی خالی (بدون پارامتر) با اصلاح کننده دسترسی عمومی باشد . این سازنده امکان ایجاد یک شی از این کلاس را بدون مشکلات غیر ضروری می دهد (به طوری که هیاهوی غیر ضروری با پارامترها ایجاد نشود).
-
فیلدهای داخلی یک کلاس از طریق متدهای get و set قابل دسترسی هستند که باید استاندارد باشند. به عنوان مثال، اگر فیلد name است ، سپس getName و setName و غیره است. این به نوبه خود به ابزارهای مختلف (فریمورکها) اجازه میدهد تا بهطور خودکار محتویات bean را بدون هیچ مشکلی تعیین و بهروزرسانی کنند.
-
کلاس باید حاوی نسخه های لغو شده متدهای () quals ()hashCode و ()toString باشد .
-
کلاس باید سریالپذیر باشد، یعنی باید یک رابط نشانگر داشته باشد - Serializable یا پیادهسازی رابط Externalizable . این امر ضروری است تا بتوان وضعیت لوبیا را به طور قابل اعتماد ذخیره، ذخیره و بازیابی کرد.
9. OutOfMemoryError چیست؟
OutOfMemoryError یکی از خطاهای حیاتی در زمان اجرا است که با عملکرد ماشین مجازی جاوا (JVM) مرتبط است. زمانی فراخوانی می شود که JVM نتواند یک شی را تخصیص دهد زیرا حافظه کافی برای آن در دسترس نیست و زباله جمع کننده نمی تواند حافظه بیشتری را اختصاص دهد. برخی از انواع OutOfMemoryError :-
OutOfMemoryError: فضای پشته جاوا - به دلیل حافظه ناکافی، شیء را نمی توان روی پشته جاوا تخصیص داد. این خطا می تواند ناشی از نشت حافظه باشد یا به این دلیل که اندازه پیش فرض پشته برای برنامه فعلی به اندازه کافی بزرگ نیست.
-
OutOfMemoryError: از حد سربار GC فراتر رفت - به دلیل این واقعیت که مقدار داده به سختی در پشته قرار می گیرد، جمع کننده زباله همیشه کار می کند و برنامه جاوا بسیار کند اجرا می شود و در نتیجه محدودیت سربار جمع کننده زباله بیش از حد است و برنامه با این خطا از کار می افتد.
-
OutOfMemoryError: اندازه آرایه درخواستی از حد مجاز VM تجاوز می کند - نشان می دهد که برنامه سعی کرده است حافظه ای را برای آرایه ای بزرگتر از اندازه پشته اختصاص دهد، که ممکن است دوباره به دلیل تخصیص ناکافی حافظه پیش فرض باشد.
-
OutOfMemoryError: Metaspace - فضای تخصیص داده شده برای ابرداده در پشته تمام شده است (فراداده دستورالعمل هایی برای کلاس ها و روش ها هستند).
-
OutOfMemoryError: درخواست اندازه بایت برای دلیل. خارج از فضای مبادله - هنگام تلاش برای تخصیص حافظه از پشته، مقداری شکست رخ داد و در نتیجه، کمبود حافظه در پشته وجود داشت.
10. stack trace چیست؟ چگونه آن را بدست آوریم؟
Stack Trace لیستی از کلاس ها و متدهایی است که تا این مرحله در برنامه فراخوانی شده اند. شما می توانید یک stack trace را در یک نقطه خاص در برنامه مانند این فراخوانی کنید:StackTraceElement[] stackTraceElements =Thread.currentThread().getStackTrace();
به این ترتیب ما آرایه ای از عناصر ردیابی پشته را خواهیم داشت که به ترتیب LIFO مرتب شده اند - Last In First Out . در جاوا، به عنوان یک قاعده، هنگامی که آنها در مورد ردیابی پشته صحبت می کنند، منظور آنها ردیابی پشته است که در هنگام بروز خطا (یا استثنا) در کنسول نمایش داده می شود. شما می توانید ردیابی پشته ای از استثناها را مانند این دریافت کنید:
StackTraceElement[] stackTraceElements;
try{
...
} catch (Exception e) {
stackTraceElements = e.getStackTrace();
}
خوب، اگر در مورد خروجی ردیابی پشته استثنا در کنسول صحبت می کنیم:
try{
...
} catch (Exception e) {
e.printStackTrace();
}
همچنین، اگر یک خطا، یک استثنا تیک نشده یا یک استثنا علامت زده داشته باشیم ، که آن را پردازش نمی کنیم، بلکه فقط آن را فوروارد می کنیم، در آن صورت وقتی برنامه از کار می افتد، به طور خودکار یک پشته از استثناها را در کنسول دریافت می کنیم. مثال کوچکی از یک استثنای stack trace در کنسول: میتوانید اطلاعات بیشتری درباره Stack Trace در اینجا بخوانید . امروز به این موضوع می پردازیم...
GO TO FULL VERSION