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

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

در گروه منتشر شد
عمل یا تئوری؟ چه چیزی مهمتر است؟ خیلی ها خواهند گفت که البته تمرین مهم تر است. تا جایی که می توانید تمرین کنید و خوشحال خواهید شد. من جرات دارم با این مخالفت کنم. تجزیه و تحلیل پرسش و پاسخ از مصاحبه برای توسعه دهنده جاوا.  قسمت 8 - 1در طول مصاحبه، هیچ کس نمی داند که شما در تمرین چقدر خوب هستید. دقیقاً طبق تئوری از شما سؤال می شود. و تنها در این صورت، زمانی که تمام مراحل مصاحبه را پشت سر بگذارید و وارد پروژه شوید، از مهارت های عملی خود استفاده خواهید کرد. ممکن است مخالفت کنید: گاهی اوقات آنها به شما یک تکلیف آزمایشی می دهند و هنوز تمرین لازم است. من بحث نمی کنم، آنها گاهی اوقات داده می شوند، اما واقعیت این است که گاهی اوقات، اما یک مصاحبه نظری همیشه انجام می شود. آیا تفاوت را احساس می کنید؟ بنابراین، شما باید یک پایه نظری محکم زیر پای خود داشته باشید که امروز نیز به تقویت آن ادامه خواهیم داد. یعنی، ما به تجزیه و تحلیل سوالاتی که اغلب در طول مصاحبه پرسیده می شوند، ادامه خواهیم داد.

71. اگر متد toString() را برای Enum لغو نکنیم چه اتفاقی می افتد؟

فرض کنید تعداد زیر را داریم :
public enum Role {
   STUDENT,
   TEACHER,
   DIRECTOR,
   SECURITY_GUARD;
}
بیایید دانش آموز را با فراخوانی toString() روی او در کنسول نمایش دهیم :
System.out.println(Role.STUDENT.toString());
نتیجه در کنسول:
دانشجو
یعنی به طور پیش فرض toString() برای enum نام خود ثابت است.

72. آیا می توان یک سازنده در داخل Enum تعیین کرد؟

بله حتما. از طریق سازنده است که مقادیر متغیرهای enum داخلی تنظیم می شود. به عنوان مثال، اجازه دهید دو فیلد را به شماره قبلی اضافه کنیم - ageFrom و ageTo - تا محدوده سنی هر نقش را مشخص کنیم:
public enum Role {
   STUDENT(5,18),
   TEACHER(20,60),
   DIRECTOR(40,70),
   SECURITY_GUARD(18,50);

   int ageFrom;
   int ageTo;

   Role(int ageFrom, int ageTo) {
       this.ageFrom = ageFrom;
       this.ageTo = ageTo;
   }
}

73. تفاوت بین == و برابر () چیست؟

این یکی از رایج ترین سوالات مصاحبه توسعه دهندگان جاوا است. بیایید با این واقعیت شروع کنیم که وقتی مقادیر ساده ( int ، char ، double ...) را با هم مقایسه می کنیم، این کار را با استفاده از == انجام می دهیم ، زیرا متغیرها حاوی مقادیر خاصی هستند و می توانیم آنها را با هم مقایسه کنیم. و متغیرهای اولیه اشیاء کامل نیستند - آنها از Object ارث نمی برند و متد () quals ندارند . هنگامی که ما در مورد مقایسه متغیرهایی که به اشیاء اشاره می کنند صحبت می کنیم، == فقط ارزش مراجع را مقایسه می کند - چه آنها به یک شی اشاره کنند یا نه. و حتی اگر یک شی با شی دیگر یکسان باشد، مقایسه از طریق == نتیجه منفی ( نادرست ) می دهد ، زیرا این یک شی متفاوت است. همانطور که متوجه شدید، از متد () quals برای مقایسه متغیرهای مرجع استفاده می شود . این یکی از متدهای استاندارد کلاس Object است که برای مقایسه کامل اشیا مورد نیاز است. اما ارزش آن را دارد که فوراً توضیح داده شود: برای اینکه این روش به درستی کار کند، باید با نوشتن دقیقاً نحوه مقایسه اشیاء این کلاس دوباره تعریف شود. مگر اینکه متد را نادیده بگیرید، به طور پیش فرض اشیا را با == مقایسه می کند . در IntelliJ IDEA ، می‌توانید آن را به‌طور خودکار لغو کنید (با استفاده از ابزارهای IDEA) -> alt + insert ، در پنجره‌ای که ظاهر می‌شود، برابر () و hashCode() -> انتخاب کنید که کدام فیلدهای کلاس شرکت کنند -> و voila، پیاده‌سازی خودکار روش ها تکمیل شده است در اینجا مثالی از این است که یک متد برابر با تولید خودکار برای یک کلاس Cat ساده با دو فیلد - int age و String name به نظر می رسد :
@Override
public boolean equals(final Object o) {
   if (this == o) return true;
   if (o == null || this.getClass() != o.getClass()) return false;
   final Cat cat = (Cat) o;
   return this.age == cat.age &&
           Objects.equals(this.name, cat.name);
}
اگر در مورد تفاوت بین == و برابر برای enums صحبت کنیم ، مقدار زیادی از آن وجود ندارد. تجزیه و تحلیل پرسش و پاسخ از مصاحبه برای توسعه دهنده جاوا.  قسمت 8 - 2پس از همه، enum ثابت ها را ذخیره می کند، و حتی هنگام مقایسه مقادیر مشابه با استفاده از == ، مقدار true را دریافت می کنیم ، زیرا مراجع همیشه به همان اشیاء خواهند بود. خوب، هنگام استفاده از برابر، عملکرد را نیز به درستی بررسی خواهیم کرد، به خصوص اگر وارد بدنه متد برابر برای یک enum شوید ، خواهید دید که در کلاس Enum پیاده سازی متد به صورت زیر است تجزیه و تحلیل پرسش و پاسخ از مصاحبه برای توسعه دهنده جاوا.  قسمت 8 - 3: داخل - مقایسه خوب قدیمی با مرجع! به طور خلاصه: برای enum ، مقایسه از طریق == و برابر صحیح است.تجزیه و تحلیل پرسش و پاسخ از مصاحبه برای توسعه دهنده جاوا.  قسمت 8 - 4

74. متد ordinal() در Enum چه می کند؟

هنگام فراخوانی متد int ordinal() روی یک عنصر enum ، عدد ترتیبی را از صفر این مقدار در سری کلی شمارش‌ها دریافت می‌کنیم. بیایید از این روش بر روی یک عنصر از فهرست قبلی مورد بحث استفاده کنیم - نقش :
System.out.println(Role.DIRECTOR.ordinal());
بر این اساس، کنسول نمایش می دهد:
2

75. آیا امکان استفاده از Enum با TreeSet یا TreeMap در جاوا وجود دارد؟

استفاده از انواع enum در TreeSet و TreeMap مجاز است. و می توانیم بنویسیم:
TreeSet<Role> treeSet = new TreeSet<>();
treeSet.add(Role.SECURITY_GUARD);
treeSet.add(Role.DIRECTOR);
treeSet.add(Role.TEACHER);
treeSet.add(Role.STUDENT);
treeSet.forEach(System.out::println);
و کنسول نمایش خواهد داد:
STUDENT TEACHER DIRECTOR SECURITY_GUARD
ما خروجی را به ترتیب حروف الفبا دریافت کردیم. نکته این است که اگر از عناصر enum برای مقادیر TreeSet یا به عنوان کلید برای TreeMap استفاده کنیم ، عناصر به ترتیب طبیعی خود (به ترتیبی که در enum مشخص شده اند ) مرتب می شوند. درک این ویژگی ها به ما کمک می کند کد بهتری بنویسیم.تجزیه و تحلیل پرسش و پاسخ از مصاحبه برای توسعه دهنده جاوا.  قسمت 8 - 5

76. متدهای ordinal() و compareTo() در Enum چگونه به هم مرتبط هستند؟

همانطور که قبلاً گفته شد، ordinal() عدد ترتیبی یک مقدار را در یک لیست شمارش عمومی برمی‌گرداند. همچنین در تجزیه و تحلیل سوال قبل مشاهده کردید که عناصر enumerations یکبار مثلاً در یک TreeSet (مجموعه مرتب شده) ترتیبی را می دهند که در enum اعلان می شوند . و همانطور که می دانیم، TreeSet و TreeMap عناصر را با فراخوانی متد ()compareTo در رابط Comparable مرتب می کنند . از این رو می‌توانیم فرض کنیم که کلاس Enum رابط Comparable را پیاده‌سازی می‌کند و آن را در متد compareTo() پیاده‌سازی می‌کند ، که در آن از ()ordinal برای تنظیم ترتیب مرتب‌سازی استفاده می‌شود. پس از ورود به کلاس Enum ، تأیید این را می بینیم: تجزیه و تحلیل پرسش و پاسخ از مصاحبه برای توسعه دهنده جاوا.  قسمت 8 - 6و بدنه خود متد: تجزیه و تحلیل پرسش و پاسخ از مصاحبه برای توسعه دهنده جاوا.  قسمت 8 - 7متد ordinal() در اینجا فراخوانی نمی شود. در عوض، از متغیر ترتیبی استفاده می شود - عدد ترتیبی عنصر در شمارش. متد ()ordinal خود تجزیه و تحلیل پرسش و پاسخ از مصاحبه برای توسعه دهنده جاوا.  قسمت 8 - 8چیزی بیش از یک دریافت کننده برای متغیر ترتیبی نیست .

77. یک مثال EnumM بنویسید

در سؤالات مطرح شده در بالا، من قبلاً مثال هایی از enums آورده ام و من اهمیتی در تکرار کد نمی بینم (مثلاً سؤال شماره 72 در مورد سازنده در enum).

78. آیا می توان از Enum در کیس سوئیچ استفاده کرد؟

ممکن و لازم است! با نگاهی به تمرین خود، متوجه می شوم که یکی از رایج ترین مکان ها برای استفاده از enum ساختارهای منطقی مانند سوئیچ است . در این حالت، شما می توانید تمام تغییرات احتمالی case را ارائه دهید و پس از نوشتن منطق برای همه مقادیر enum - و استفاده از عملگر پیش فرض حتی ممکن است ضروری نباشد! از این گذشته، اگر از یک رشته یا یک مقدار عددی، به عنوان مثال، از نوع int استفاده کنید ، ممکن است مقدار غیرمنتظره ای دریافت کنید که به نوبه خود با استفاده از enum غیرممکن است . یک سوئیچ برای مثالی که قبلاً بحث شد چگونه به نظر می رسد :
public void doSomething(Role role) {
   switch (role) {
       case STUDENT:
           // некая логика для STUDENT
           break;
       case TEACHER:
           // некая логика для TEACHER
           break;
       case DIRECTOR:
           // некая логика для DIRECTOR
           break;
       case SECURITY_GUARD:
           // некая логика для SECURITY_GUARD
           break;
   }
}

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

اگر باید همه نمونه‌های یک enum را دریافت کنید، یک متد values() وجود دارد که آرایه‌ای از تمام مقادیر موجود از یک enum خاص را به ترتیب طبیعی (به ترتیبی که در enum مشخص شده‌اند ) برمی‌گرداند. مثال:
Role[] roles = Role.values();
for (Role role : roles) {
   System.out.println(role);
}
کنسول خروجی زیر را نمایش می دهد:
STUDENT TEACHER DIRECTOR SECURITY_GUARD

Stream API

80. Stream در جاوا چیست؟

جاوا استریم یک روش نسبتاً جدید برای تعامل با یک جریان داده است که به نوبه خود به شما امکان می دهد تا داده های بزرگ را راحت تر و فشرده تر پردازش کنید و همچنین پردازش داده ها را بین تعداد معینی از رشته ها موازی کنید که می تواند عملکرد را در استفاده افزایش دهد. عملکرد. این موضوع را نمی توان به طور خلاصه و عمیق تر مورد بحث قرار داد، بنابراین من در اینجا پیوندی به مقاله ای می گذارم که می تواند به شما کمک کند در این موضوع شیرجه بزنید.تجزیه و تحلیل پرسش و پاسخ از مصاحبه برای توسعه دهنده جاوا.  قسمت 8 - 9

81. خواص اصلی معاملات چیست؟

این موضوع Stream API نام دارد، اما سوال در مورد تراکنش است. هوم... ابتدا بیایید بفهمیم که تراکنش چیست. تراکنش گروهی از عملیات پایگاه داده متوالی است که واحد منطقی کار با داده ها را نشان می دهد. یک تراکنش می تواند به طور کامل و با موفقیت انجام شود و یکپارچگی داده ها حفظ شود و مستقل از سایر تراکنش هایی که به صورت موازی انجام می شوند، یا اصلاً نمی توانند تکمیل شوند، در این صورت هیچ تاثیری ندارد. بنابراین، معاملات دارای چهار ویژگی اصلی هستند که به اختصار ACID نامیده می شود . بیایید ببینیم که هر حرف از این مخفف چگونه مخفف است: A - Atomicity - Atomicity - این ویژگی تضمین می کند که هیچ تراکنش به طور جزئی در سیستم ثبت نخواهد شد. یا تمام عملیات فرعی آن انجام خواهد شد، یا هیچ یک ( همه یا هیچ ) انجام نخواهد شد. ج - سازگاری - سازگاری خاصیتی است که تضمین می کند هر تراکنش موفق فقط نتایج معتبر را ثبت می کند. یعنی این تضمینی است که در صورت موفقیت آمیز بودن تراکنش، تمام قوانین و محدودیت هایی که سیستم بر روی داده های خاص اعمال می کند رعایت می شود، در غیر این صورت تراکنش کامل نمی شود و داده های موجود در سیستم به حالت قبلی خود باز می گردند. حالت. I - Isolation - Isolation خاصیتی است که می گوید در حین انجام معامله، معاملات موازی نباید در نتیجه آن تأثیر بگذارد. این ویژگی به منابع فشرده است، بنابراین به طور معمول تا حدی با اجازه دادن به سطوح خاصی از عایق که مشکلات عایق خاصی را حل می کند، اجرا می شود. در سوال بعدی به تفصیل در این مورد بحث خواهیم کرد. تجزیه و تحلیل پرسش و پاسخ از مصاحبه برای توسعه دهنده جاوا.  قسمت 8 - 10د - دوام - این خاصیت تضمین می کند که اگر کاربر تاییدیه ای مبنی بر انجام تراکنش از سیستم دریافت کرده باشد، می تواند مطمئن باشد که تغییراتی که انجام داده است به دلیل برخی خرابی ها لغو نخواهد شد. به این معنی که اگر قبلاً تأیید موفقیت آمیز بودن تراکنش خود را دریافت کرده باشید، می توانید مطمئن باشید که نوعی خرابی سیستم عامل هیچ کاری برای داده های شما نخواهد داشت.

82. سطوح جداسازی معاملات چیست؟

همانطور که قبلاً گفتم، ارائه جداسازی ACID یک فرآیند فشرده منابع است. بنابراین این ملک تا حدودی راضی است. سطوح مختلفی از انزوا وجود دارد و هر چه این سطح بالاتر باشد، تأثیر بیشتری بر بهره وری دارد. قبل از حرکت به سطوح جداسازی تراکنش، باید به مشکلات مختلف جداسازی ناکافی تراکنش توجه کنیم :
  • خواندن فانتوم - وقتی همان نمونه (همان پرس و جو) به طور مکرر در یک تراکنش فراخوانی می شود، داده های دریافتی متفاوت است، که به دلیل درج داده ها توسط تراکنش دیگر رخ می دهد.

  • خواندن غیر تکراری - هنگامی که یک نمونه (همان پرس و جو) به طور مکرر در همان تراکنش فراخوانی می شود، داده های دریافتی متفاوت است، که به دلیل تغییرات (به روز رسانی) و حذف داده ها توسط تراکنش دیگر رخ می دهد.

  • خواندن کثیف - فرآیند خواندن داده‌های اضافه شده یا تغییر یافته توسط تراکنشی که متعاقباً تأیید نشده است (به عقب برگشته است)، یعنی. خواندن داده های نامعتبر؛

  • به روز رسانی از دست رفته - هنگامی که تراکنش های مختلف داده های مشابهی را به طور همزمان تغییر می دهند، همه تغییرات به جز آخرین مورد از بین می روند (یادآور مشکل "شرایط مسابقه" در یک محیط چند رشته ای).

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

83. تفاوت Statement و PreparedStatement چیست؟

و در اینجا انتقال بسیار آرامی به ویژگی های فناوری JDBC وجود ندارد . بنابراین، ابتدا بیایید بفهمیم که بیانیه در واقع چیست . این یک شی است که برای تولید پرس و جوهای SQL استفاده می شود. JDBC از سه نوع استفاده می کند - Statement , PreparedStatement و CallableStatement . ما امروز به CallableStatement نگاه نمی کنیم : بیایید در مورد تفاوت بین Statement و PreparedStatement صحبت کنیم .
  1. بیانیه برای اجرای پرس و جوهای SQL ساده بدون پارامترهای ورودی و درج شده پویا استفاده می شود. PrepareStatement با قابلیت درج پویا پارامترهای ورودی استفاده می شود.

  2. برای تنظیم پارامترها در PreparedStatement، پارامترهای ورودی در درخواست به صورت علامت سوال نوشته می‌شوند، به طوری که می‌توان به جای آن یک مقدار با استفاده از تنظیم‌کننده‌های مختلف مانند setDouble() , setFloat() , setInt() , setTime() درج کرد . . در نتیجه، نوع اشتباهی از داده ها را در پرس و جو خود وارد نمی کنید.

  3. PreparedStatement "از پیش کامپایل شده" است و از کش استفاده می کند، بنابراین اجرای آن می تواند کمی سریعتر از پرس و جو از اشیاء Statement باشد . در نتیجه، پرس و جوهای SQL که به طور مکرر اجرا می شوند به عنوان اشیاء PreparedStatement برای بهبود عملکرد نوشته می شوند .

  4. بیانیه در برابر تزریق SQL آسیب پذیر است، در حالی که PreparedStatement از آنها جلوگیری می کند. در این مقاله درباره حذف تزریق SQL و سایر بهترین روش ها در امنیت جاوا بیشتر بخوانید .

اگر شروع به مطالعه فناوری اتصال یک برنامه جاوا به یک پایگاه داده - JDBC کرده اید، به شما توصیه می کنم با این مقاله شروع کنید . خوب، در این مرحله ما امروز متوقف خواهیم شد.Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 8 - 11
سایر مواد این سری:
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION