
پرسش و پاسخ برای یک موقعیت توسعه دهنده جوان
سوالات عمومی
1. چه الگوهای طراحی را می شناسید؟ از دو الگوی طراحی که در کار خود استفاده کرده اید بگویید.
الگوهای بسیار متنوعی وجود دارد. برای شما که می خواهید کاملاً با الگوهای طراحی آشنا شوید، خواندن کتاب «اول سر. الگوهای طراحی» را توصیه می کنم. این به شما کمک می کند تا به راحتی جزئیات اولیه ترین الگوهای طراحی را بیاموزید. از نظر الگوهای طراحی که می توانید در مصاحبه شغلی به آنها اشاره کنید، موارد زیر به ذهن می رسد:- Builder - یک الگوی پرکاربرد، جایگزینی برای رویکرد کلاسیک برای ایجاد شی.
- استراتژی - الگویی که اساساً چندشکلی را نشان می دهد. یعنی ما یک رابط داریم، اما رفتار برنامه بسته به اجرای واسط خاص که به تابع منتقل می شود تغییر می کند (الگوی استراتژی اکنون تقریباً در همه جا در برنامه های جاوا استفاده می شود).
- Factory - این الگو را می توان در ApplicationContext (یا در BeanFactory) یافت.
- Singleton - همه لوبیاها به طور پیش فرض تک تن هستند.
- پروکسی - اساساً همه چیز در Spring از این الگو به روشی استفاده می کند، به عنوان مثال، AOP.
- زنجیره مسئولیت - الگویی که زیربنای امنیت بهار است.
- الگو - در 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 بایت را اشغال می کند.
- مقادیر درست/نادرست بولی ، 1 بایت را اشغال می کند.
3. یک شی چه تفاوتی با انواع داده های اولیه دارد؟
اولین تفاوت در مقدار حافظه اشغال شده است: اولیه ها خیلی کم را اشغال می کنند زیرا فقط حاوی مقدار خودشان هستند، اما اشیاء می توانند مقادیر زیادی از مقادیر مختلف را دربر گیرند - هم اولیه و هم ارجاع به اشیاء دیگر. تفاوت دوم این است: جاوا یک زبان شی گرا است، بنابراین همه چیز در جاوا یک تعامل بین اشیا است. بدوی ها در اینجا خیلی مناسب نیستند. در واقع، به همین دلیل است که جاوا یک زبان 100٪ شی گرا نیست. سومین تفاوتی که از دومی حاصل می شود این است که چون جاوا بر تعاملات شی متمرکز است، مکانیسم های مختلفی برای مدیریت اشیا وجود دارد. به عنوان مثال، سازندهها، متدها، استثناها (که عمدتاً با اشیا کار میکنند) و غیره و برای اجازه دادن به اولیهها به نحوی در این محیط شی گرا، سازندگان جاوا بستهبندیهایی برای انواع اولیه ( عدد صحیح ، کاراکتر ، دوبل ، بولی ) ارائه کردند. ...)4. تفاوت بین ارسال آرگومان ها با مرجع و ارزش چیست؟
فیلدهای اولیه مقدار خود را ذخیره می کنند: برای مثال، اگر int i = 9 را تنظیم کنیم . ، سپس فیلد i مقدار 9 را ذخیره می کند. وقتی به یک شی ارجاع داریم، به این معنی است که یک فیلد با ارجاع به شی داریم. به عبارت دیگر، فیلدی داریم که آدرس شی را در حافظه ذخیره می کند.Cat cat = new Cat();
این بدان معنی است که فیلدهایی با ارجاع به یک شی نیز مقادیر را ذخیره می کنند . مقادیر آنها آدرس حافظه است. یعنی cat آدرس حافظه شی جدید Cat() را ذخیره می کند . وقتی آرگومان را به یک متد ارسال می کنیم، مقدار آن کپی می شود. در مورد اولیه، مقدار اولیه کپی می شود. بر این اساس، روش با کپی کار می کند. وقتی کپی تغییر می کند، نسخه اصلی تحت تأثیر قرار نمی گیرد. در مورد نوع مرجع، مقدار آدرس حافظه کپی می شود. بر این اساس، هر دو متغیر مرجع آدرس هایی را که به یک شی اشاره می کنند ذخیره می کنند. و اگر از این مرجع جدید برای تغییر شی استفاده کنیم، متوجه می شویم که برای مرجع قدیمی نیز تغییر کرده است. بالاخره هر دو به یک شی اشاره می کنند.
5. JVM، JDK و JRE چیست؟
JVM مخفف Java Virtual Machine است که بایت کد جاوا را اجرا می کند که از قبل توسط کامپایلر تولید شده است. JRE مخفف Java Runtime Environment است . اساساً محیطی برای اجرای برنامه های جاوا است. این شامل JVM، کتابخانه های استاندارد، و سایر اجزاء برای اجرای اپلت ها و برنامه های کاربردی نوشته شده به زبان برنامه نویسی جاوا است. به عبارت دیگر، JRE بسته ای از همه چیزهایی است که برای اجرای یک برنامه جاوا کامپایل شده لازم است، اما شامل ابزارها و ابزارهایی مانند کامپایلر یا دیباگر برای توسعه برنامه ها نمی شود. JDK مخفف Java Development Kit است که پسوند JRE است . یعنی محیطی است نه تنها برای اجرای برنامه های جاوا، بلکه برای توسعه آنها. JDK شامل همه چیز در JRE است، به علاوه ابزارهای اضافی مختلف - کامپایلرها و اشکال زداها - مورد نیاز برای ایجاد برنامه های جاوا (شامل اسناد جاوا).
6. چرا از JVM استفاده کنیم؟
همانطور که در بالا گفته شد، ماشین مجازی جاوا یک ماشین مجازی است که بایت کد جاوا را اجرا می کند که از قبل توسط کامپایلر تولید شده است. این بدان معناست که JVM کد منبع جاوا را درک نمی کند. بنابراین، ابتدا فایلهای جاوا را کامپایل میکنیم . فایل های کامپایل شده دارای پسوند .class هستند و اکنون به شکل بایت کد هستند که JVM آن را درک می کند. JVM برای هر سیستم عامل متفاوت است. هنگامی که JVM فایل های بایت کد را اجرا می کند، آنها را برای سیستم عاملی که در آن اجرا می شود، تطبیق می دهد. در واقع، به دلیل وجود JVM های مختلف، JDK (یا JRE) نیز برای سیستم عامل های مختلف متفاوت است (هر نسخه به JVM خود نیاز دارد). بیایید به یاد بیاوریم که توسعه در سایر زبان های برنامه نویسی چگونه کار می کند. شما یک برنامه می نویسید، سپس کد آن به کد ماشین برای یک سیستم عامل خاص کامپایل می شود و سپس می توانید آن را اجرا کنید. به عبارت دیگر، شما باید نسخه های مختلفی از برنامه را برای هر پلتفرم بنویسید. اما پردازش مضاعف کد توسط جاوا (ترکیب کد منبع به بایت کد و سپس پردازش بایت کد توسط JVM) به شما امکان می دهد از مزایای یک راه حل بین پلت فرمی لذت ببرید. کد را یک بار ایجاد می کنیم و آن را به بایت کد کامپایل می کنیم. سپس میتوانیم آن را به هر سیستمعاملی ببریم، و JVM بومی میتواند آن را اجرا کند. و این دقیقاً ویژگی افسانهای جاوا برای نوشتن یک بار، اجرا در هر نقطه است .
7. بایت کد چیست؟
همانطور که در بالا گفتم، کامپایلر کد جاوا را به بایت کد میانی تبدیل می کند (ما از فایل هایی با پسوند java به فایل هایی با پسوند .class می رویم). از بسیاری جهات، بایت کد شبیه به کد ماشین است، با این تفاوت که مجموعه دستورالعمل آن برای یک پردازنده واقعی نیست، بلکه یک پردازنده مجازی است. گفته میشود، میتواند شامل بخشهایی باشد که برای یک کامپایلر JIT طراحی شدهاند، که اجرای فرمان را برای پردازنده واقعی که برنامه روی آن اجرا میکند بهینه میکند. کامپایل JIT که به آن کامپایل on-the-fly نیز گفته می شود، فناوری است که عملکرد برنامه بایت کد را با کامپایل کردن بایت کد در کد ماشین یا فرمت دیگری در حین اجرای برنامه افزایش می دهد. همانطور که ممکن است حدس بزنید، JVM هنگام اجرای بایت کد از کامپایلر JIT استفاده می کند. بیایید به چند بایت کد نمونه نگاهی بیندازیم:
8. JavaBean چه ویژگی هایی دارد؟
JavaBean یک کلاس جاوا است که از قوانین خاصی پیروی می کند. در اینجا برخی از قوانین برای نوشتن JavaBean آمده است :-
کلاس باید حاوی یک سازنده خالی (بدون آرگومان) با اصلاح کننده دسترسی عمومی باشد . این سازنده امکان ایجاد یک شی از کلاس را بدون هیچ گونه مشکل غیر ضروری می دهد (به طوری که هیچ دستکاری غیر ضروری با آرگومان ها وجود ندارد).
-
فیلدهای داخلی از طریق متدهای نمونه get و set قابل دسترسی هستند که باید اجرای استاندارد را داشته باشند. به عنوان مثال، اگر یک فیلد نام داریم ، باید getName و setName و غیره را داشته باشیم . این به ابزارهای مختلف (فریمورکها) اجازه میدهد تا بدون هیچ مشکلی محتوای beans را بهطور خودکار دریافت و تنظیم کنند.
-
کلاس باید متدهای equals() , 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();
این به ما آرایه ای از StackTraceElements می دهد که به ترتیب Last In First Out (LIFO) مرتب شده اند . 
StackTraceElement[] stackTraceElements;
try{
...
} catch (Exception e) {
stackTraceElements = e.getStackTrace();
}
و اگر بخواهیم رد پشته یک استثنا را در کنسول نمایش دهیم:
try{
...
} catch (Exception e) {
e.printStackTrace();
}
بهعلاوه، اگر یک خطا، استثنای علامتنخورده ، یا استثنای بررسی نشده رخ دهد، بهطور خودکار وقتی برنامه از کار میافتد، ردپای پشته استثنا را روی کنسول دریافت میکنیم. در اینجا یک مثال کوچک از stack trace در کنسول آورده شده است: 

GO TO FULL VERSION