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

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

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

کتابخانه ها و استانداردها

52. Hibernate چیست؟ تفاوت بین JPA و Hibernate چیست؟

برای پاسخ به این سوال، فکر می کنم ابتدا باید بدانیم JPA چیست. این مشخصاتی است که یک نگاشت شی-رابطه ای از اشیاء ساده جاوا را توصیف می کند و یک API برای ذخیره، بازیابی و دستکاری چنین اشیایی ارائه می دهد. یعنی پایگاه داده های رابطه ای (DB) به صورت مجموعه ای از جداول به هم پیوسته نمایش داده می شوند. و JPA استانداردی است که به طور گسترده پذیرفته شده است که نحوه تعامل اشیاء با پایگاه داده های رابطه ای را توصیف می کند. همانطور که می بینید، JPA چیزی انتزاعی و ناملموس است. این مانند خود ایده، رویکرد است. بررسی پرسش ها و پاسخ های مصاحبه شغلی برای یک موقعیت توسعه دهنده جاوا.  قسمت 6 - 3اما Hibernate یک کتابخانه خاص است که پارادایم های JPA را پیاده سازی می کند. به منظور کلمات، می توانید از این کتابخانه برای کار با یک پایگاه داده رابطه ای از طریق اشیایی که داده ها را در پایگاه داده (Entity) نشان می دهند، استفاده کنید. گفته می شود این کتابخانه به ایده آل های JPA بسیار نزدیک است. شاید به همین دلیل محبوب شد. همانطور که می توانید تصور کنید، محبوبیت آن توسعه و پیشرفت بیشتر را توجیه می کند. علاوه بر این، استفاده گسترده از جامعه وسیعی سرچشمه می گیرد که قبلاً هر سؤال ممکن و غیرممکن مربوط به این ابزار را بررسی کرده است. Hibernate به طور کامل مورد مطالعه قرار گرفته است، و همانطور که مشخص است، قابل اعتماد است. دلیل خوبی وجود دارد که چرا حتی اجرای ایده آل JPA در بهار معمولاً از Hibernate در زیر هود استفاده می کند.

53. آبشاری چیست؟ چگونه در Hibernate استفاده می شود؟

همانطور که قبلاً گفتم، ارتباط در Hibernate از طریق اشیاء داده ای به نام موجودیت ها انجام می شود. این موجودیت ها جداول خاصی را در پایگاه داده نشان می دهند، و همانطور که به یاد دارید، کلاس های جاوا می توانند ارجاعاتی به کلاس های دیگر داشته باشند. این روابط در پایگاه داده نیز منعکس شده است. به عنوان یک قاعده، آنها یا کلیدهای خارجی (برای روابط OneToOne، OneToMany، ManyToOne) یا جداول میانی (برای روابط ManyToMany) هستند. هنگامی که نهاد شما به سایر نهادهای مرتبط ارجاع دارد، حاشیه نویسی در بالای این مراجع قرار می گیرد تا نوع رابطه را نشان دهد: @OneToOne، @OneToMany، @ManyToOne، @ManyToMany. می توانید نوع آبشار این رابطه را در ویژگی آبشار حاشیه نویسی ها مشخص کنید. JPA روش های خاصی برای تعامل با موجودیت ها (تداوم، ذخیره، ادغام ...) دارد. انواع آبشار برای نشان دادن اینکه داده های مرتبط چگونه باید رفتار کنند استفاده می شود. این روش ها بر روی یک موجودیت هدف استفاده می شود. بنابراین استراتژی های آبشاری (انواع آبشاری) چیست؟ استاندارد JPA استفاده از شش نوع آبشار را فراهم می کند:
  • PERSIST - عملیات ذخیره در یک آبشار (برای متدهای save() و persist() رخ می دهد . به عبارت دیگر، اگر موجودی را ذخیره کنیم که با موجودیت های دیگر مرتبط است، آن موجودیت ها نیز در پایگاه داده ذخیره می شوند (اگر قبلاً وجود نداشته باشند)

  • MERGE - عملیات به روز رسانی در یک آبشار (برای روش merge() ) رخ می دهد.

  • REMOVE - عملیات حذف در یک روش آبشاری ( روش remove() ) رخ می دهد.

  • ALL - شامل سه عملیات آبشاری به طور همزمان - PERSIST - MERGE - REMOVE

JPA مفهوم یک موجودیت پایدار را دارد - موجودیتی که با داده های آن در پایگاه داده مرتبط است و توسط جلسه فعلی (اتصال) کنترل می شود. اگر آن را بدون ذخیره تغییرات در پایگاه داده تغییر دهید، داده های موجود در پایگاه داده همچنان تغییر می کند.
  • DETACH - موجودیت های مرتبط توسط جلسه ( روش detach() ) مدیریت نمی شوند. یعنی زمانی که داده‌های موجودیت‌های مرتبط تغییر می‌کنند، داده‌های پایگاه داده به‌طور خودکار به‌روزرسانی نمی‌شوند - آنها از دائمی به جدا تبدیل می‌شوند (یعنی موجودیت توسط JPA مدیریت نمی‌شود)

  • REFRESH - هر بار که یک موجودیت با داده های پایگاه داده ( refresh() refresh می شود - اشیاء جدا شده را تازه می کند، موجودیت های مرتبط با آن نیز به روز می شوند. به عنوان مثال، شما به نوعی داده های گرفته شده از پایگاه داده را تغییر داده اید و می خواهید مقادیر اصلی را بازیابی کنید. در این صورت، این عملیات برای شما مفید خواهد بود.

بررسی پرسش ها و پاسخ های مصاحبه شغلی برای یک موقعیت توسعه دهنده جاوا.  قسمت 6 - 4Hibernate از تمام این عملیات آبشاری استاندارد پشتیبانی می کند و همچنین سه مورد از خود را معرفی می کند:
  • RePLICATE - زمانی استفاده می شود که بیش از یک منبع داده داریم و می خواهیم داده ها همگام شوند (روش تکرار Hibernate). همه نهادها باید شناسه (id) داشته باشند تا اطمینان حاصل شود که بدون مشکل ایجاد می شوند (برای اطمینان از اینکه یک موجودیت شناسه های مختلف برای پایگاه داده های مختلف ندارد)

  • SAVE_UPDATE - ذخیره/حذف آبشاری (برای روش SaveOrUpdate Hibernate )

  • LOCK - برعکس عملیات DETACHED : یک موجودیت جدا شده را به حالت پایدار برمی گرداند، یعنی جلسه فعلی یک بار دیگر موجودیت را ردیابی می کند.

اگر هیچ نوع آبشاری انتخاب نشده باشد، عملیات روی موجودیت بر دیگر موجودیت‌های مرتبط با آن تأثیر نخواهد گذاشت.

54. آیا یک کلاس Entity می تواند انتزاعی باشد؟

طبق 2.1 کلاس Entity مشخصات JPA ، " کلاس انتزاعی و مشخص می توانند موجودیت باشند. " بنابراین، پاسخ مثبت است، یک کلاس انتزاعی می تواند یک موجودیت باشد و می تواند با حاشیه نویسی @Entity علامت گذاری شود.

55. مدیر نهاد چیست؟ مسئول چیست؟

اول از همه، من می خواهم توجه داشته باشم که EntityManager یک جزء حیاتی از JPA است . برای تعامل نهادها با پایگاه داده استفاده می شود. به طور کلی، متدهایی برای تعامل موجودیت با پایگاه داده بر روی موجودیت فراخوانی می شوند (persist, merge, remove, detach)... اما این را نیز متذکر می شوم که این کامپوننت معمولاً برای کل برنامه تکی نیست. اغلب سبک است، یکی حذف می شود، و یک مورد جدید با استفاده از EntityManagerFactory ایجاد می شود . اگر یک موازی با JDBC ترسیم کنیم ، جایی که EntityManagerFactory مشابه DataSource است ، EntityManager مشابه Connection است . قبلاً اشاره کردم که موجودیت پایدار موجودی است که توسط اتصال فعلی مدیریت می شود. این نهاد توسط EntityManager که ارتباط نزدیکی با اتصال فعلی دارد و TransactionManager که مسئول باز کردن/بستن تراکنش ها است مدیریت می شود. در شکل زیر، چرخه حیات موجودیت را می بینید: بررسی پرسش ها و پاسخ های مصاحبه شغلی برای یک موقعیت توسعه دهنده جاوا.  قسمت 6 - 5EntityManager زمانی که موجودیت در مرحله Managed باشد (زمانی که پایدار است، زیرا با EntityManager ارتباط دارد) آن را مدیریت می کند . یعنی جدید نیست و همچنین حذف نشده است. هنگامی که یک موجودیت جدید یا حذف شده است، می توان گفت که آن نیز جدا شده است، زیرا EntityManager آن را مدیریت نمی کند. استراتژی های مختلفی برای EntityManager وجود دارد . می توانید برای کل برنامه یک EntityManager singleton داشته باشید یا هر بار برای هر اتصال یک مورد جدید ایجاد کنید. اگر از Spring استفاده می‌کنید، ایجاد/حذف EntityManager به‌طور خودکار تحت پوشش مدیریت می‌شود (اما این بدان معنا نیست که نمی‌توانید آن را برای خودتان سفارشی کنید ^^). لازم است اشاره کنم که یک یا چند EntityManager یک زمینه ماندگاری را تشکیل می دهند . زمینه ماندگاری محیطی است که در آن نمونه‌های موجودیت‌ها با موجودیت‌های مشابه در پایگاه داده همگام‌سازی می‌شوند (همانطور که گفتم، این فقط برای موجودیت‌های پایدار کار می‌کند). اگر عمیق‌تر به JPA بپردازید (که من به شدت توصیه می‌کنم)، اغلب با این مفهوم مواجه خواهید شد.

56- کلاس Assert چیست؟ چرا استفاده می شود؟

من در مورد چنین کلاسی در JPA نشنیده‌ام ، بنابراین فرض می‌کنم که این سؤال به کلاسی در کتابخانه JUnit اشاره دارد که برای تست‌های واحد استفاده می‌شود. در این کتابخانه، کلاس Assert برای بررسی نتایج اجرای کد استفاده می شود (در اینجا assert به معنای ادعایی است که شما وضعیت/داده خاصی را در یک مکان خاص در کد دارید). به عنوان مثال، فرض کنید شما در حال آزمایش روشی هستید که قرار است یک گربه ایجاد کند. شما روش را اجرا می کنید و نتیجه ای می گیرید:
Cat resultOfTest = createCat();
اما باید مطمئن شوید که درست ایجاد شده است، درست است؟ بنابراین شما به صورت دستی یک cat خاص ( expectCat ) با دقیقاً پارامترهایی که انتظار دارید در cat بدست آمده از متد ()createCat مشاهده کنید ایجاد می کنید . سپس از کلاس Assert برای تأیید نتایج استفاده می کنید :
Assert.assertEquals(resultOfTest, expectedCat);
اگر گربه‌ها متفاوت باشند، یک AssertionError پرتاب می‌شود که به ما می‌گوید نتایج مورد انتظار را نگرفتیم. کلاس Assert روش‌های مختلفی دارد که انواع عملیات را پوشش می‌دهد که در تأیید نتایج مورد انتظار مفید است. در اینجا تعداد کمی از آنها هستند:
  • assertTrue(<boolean>) - انتظار می رود مقدار ارسال شده به عنوان آرگومان درست باشد

  • assertFalse(<boolean>) - انتظار می رود مقدار ارسال شده به عنوان آرگومان نادرست باشد

  • assertNotEquals(<object1>, <object2>) - اشیاء ارسال شده به عنوان آرگومان باید در مقایسه با برابر با ( نادرست ) متفاوت باشند.

  • assertThrows(<ClassNameOfException>.class، <exceptionObject>) — انتظار می رود که آرگومان دوم یک استثنا باشد که توسط آرگومان اول پرتاب می شود (یعنی آرگومان دوم معمولاً یک فراخوانی متدی است که باید استثنایی از نوع مورد نیاز ایجاد کند)

رشته

57. کلاس String جاوا را شرح دهید

String یک کلاس استاندارد جاوا است که مسئول ذخیره و دستکاری مقادیر رشته (توالی کاراکترها) است. این یک کلاس غیرقابل تغییر است ( قبلاً در مورد imutable اینجا نوشتم )، یعنی داده های اشیاء این کلاس پس از ایجاد شدن قابل تغییر نیستند. می‌خواهم فوراً اشاره کنم که کلاس‌های StringBuilder و StringBuffer اساساً یکسان هستند - تنها تفاوت این است که یکی از آنها برای استفاده در یک محیط چند رشته‌ای ( StringBuffer ) در نظر گرفته شده است. این کلاس ها مانند String هستند ، اما در تغییرپذیر بودن آنها با هم تفاوت دارند . حتی پس از ایجاد آنها، آنها به شما اجازه می دهند رشته هایی را که نشان می دهند، بدون ایجاد یک شی جدید، تغییر دهید. روش های آنها با روش های استاندارد String متفاوت است و برای دستکاری رشته طراحی شده اند (دلیلی وجود دارد که آنها آن را سازنده می نامند).

58- راه های ایجاد شی String چیست؟ کجا ایجاد می شود؟

رایج ترین راه برای ایجاد رشته این است که مقدار مورد نظر خود را در دو علامت نقل قول به سادگی مشخص کنیم:
String str = "Hello World!";
همچنین می توانید این کار را به صراحت با استفاده از new انجام دهید :
String str = new String("Hello World!");
شما همچنین می توانید یک رشته از مجموعه ای از کاراکترها ایجاد کنید:
char[] charArr = {'H','e','l','l','o',' ', 'W','o','r','l','d','!'};
String str = new String(charArr);
می‌توانیم با فراخوانی متد toString روی برخی شی‌ها این کار را انجام دهیم :
String str = someObject.toString();
ما می توانیم با فراخوانی هر متد دیگری که یک رشته را برمی گرداند این کار را انجام دهیم. مثال:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str = reader.readLine();
می‌دانید که راه‌های زیادی برای ایجاد یک رشته وجود دارد. هنگامی که یک شی String ایجاد می شود، در یک مجموعه رشته ای ذخیره می شود ، که در یکی از سوالات زیر با جزئیات بیشتر در مورد آن صحبت خواهیم کرد.

59. چگونه دو رشته جاوا را با هم مقایسه می کنید و چگونه آنها را مرتب می کنید؟

جاوا از علامت مساوی دوتایی ( == ) برای انجام مقایسه استفاده می کند. اگر نیاز به مقایسه مقادیر ساده مانند ints داشته باشیم، از آن استفاده خواهیم کرد. اما این روش برای مقایسه اشیاء تمام عیار مناسب نیست. فقط مراجع را با هم مقایسه می کند، یعنی آیا ارجاعات به یک شی اشاره دارند یا خیر. این بدان معنی است که اگر دو شی با مقادیر فیلد یکسان را با استفاده از == مقایسه کنیم ، false دریافت خواهیم کرد . فیلدها مقادیر یکسانی دارند، اما خود اشیا مکان های متفاوتی در حافظه اشغال می کنند. اشیاء رشته ای ، علیرغم سادگی فریبنده شان، همچنان اشیاء هستند. مقایسه آنها با استفاده از == نیز مناسب نیست (علی رغم وجود استخر رشته). راه‌حل مناسب، متد برابر استاندارد کلاس Object است که برای درست کار کردن باید رد شود (به طور پیش‌فرض از == برای مقایسه استفاده می‌کند). کلاس String آن را لغو می کند، بنابراین ما فقط از پیاده سازی آن استفاده می کنیم:
String firstStr = "Hello World!";
String secondStr = "Hello World!";
boolean isEquals = firstStr.equals(secondStr);
بررسی پرسش ها و پاسخ های مصاحبه شغلی برای یک موقعیت توسعه دهنده جاوا.  قسمت 6 - 6ما در مورد مقایسه برای برابری صحبت کرده ایم. اکنون مقایسه هایی را برای مرتب سازی کشف خواهیم کرد. از این گذشته، اگر می‌خواهیم چیزی را مرتب کنیم، باید بدانیم که از چه اصولی برای مرتب‌سازی استفاده می‌کنیم. برای انجام این کار، می توانید از TreeSet ، یک مجموعه مرتب شده استاندارد استفاده کنید. این ساختار داده بر الگوریتم درخت قرمز-سیاه متکی است و مجموعه را بر اساس یک اصل مرتب سازی مشخص مرتب می کند. همانطور که قبلاً گفتم، باید بدانید که چگونه اشیاء از یک نوع خاص را مرتب کنید. برای تعیین روش مقایسه برای مرتب سازی، از مقایسه کننده ها استفاده کنید . شما معمولاً باید آنها را برای کلاس هایی که می خواهید مرتب کنید پیاده سازی کنید، اما در مورد String ، آنها قبلاً پیاده سازی شده اند. بر این اساس، ما به سادگی رشته های خود را به TreeSet اضافه می کنیم و آنها را برای ما مرتب می کند:
TreeSet<String> sortedSet = new TreeSet<>();
sortedSet.add("B");
sortedSet.add("C");
sortedSet.add("A");
sortedSet.forEach(System.out::println);
خروجی کنسول:
ABC

60. الگوریتمی برای تبدیل رشته به کاراکتر ارائه دهید. کد مربوطه را بنویسید

همانطور که قبلاً گفتم، اشیاء String روش‌های مفید زیادی دارند. یکی از اینها toCharArray است . این روش یک رشته را به یک آرایه کاراکتری تبدیل می کند:
String str = "Hello world";
char[] charArr = str.toCharArray();
در مرحله بعد، ما یک آرایه از کاراکترها داریم که می توانیم با شاخص به آنها ارجاع دهیم:
char firstChar = charArr[0]; // H

61. چگونه می توان یک رشته را به آرایه بایتی تبدیل کرد و برگشت داد؟ کد مربوطه را بنویسید

کلاس String یک متد getBytes دارد که شبیه به متد toCharArray است و رشته را به صورت آرایه بایتی برمی گرداند:
String str = "Hello world";
byte[] byteArr = str.getBytes();
byte firstChar = byteArr[6]; // 119
ما به نتیجه منطقی بررسی امروز خود رسیده ایم. با تشکر برای خواندن!
بیشتر بخوانید:
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION