71. اگر متد toString() را برای Enum لغو نکنیم چه اتفاقی می افتد؟
فرض کنید تعداد زیر را داریم :public enum Role {
STUDENT,
TEACHER,
DIRECTOR,
SECURITY_GUARD;
}
بیایید دانش آموز را با فراخوانی toString() روی او در کنسول نمایش دهیم :
System.out.println(Role.STUDENT.toString());
نتیجه در کنسول:
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 صحبت کنیم ، مقدار زیادی از آن وجود ندارد. پس از همه، enum ثابت ها را ذخیره می کند، و حتی هنگام مقایسه مقادیر مشابه با استفاده از == ، مقدار true را دریافت می کنیم ، زیرا مراجع همیشه به همان اشیاء خواهند بود. خوب، هنگام استفاده از برابر، عملکرد را نیز به درستی بررسی خواهیم کرد، به خصوص اگر وارد بدنه متد برابر برای یک enum شوید ، خواهید دید که در کلاس Enum پیاده سازی متد به صورت زیر است : داخل - مقایسه خوب قدیمی با مرجع! به طور خلاصه: برای enum ، مقایسه از طریق == و برابر صحیح است.
74. متد ordinal() در Enum چه می کند؟
هنگام فراخوانی متد int ordinal() روی یک عنصر enum ، عدد ترتیبی را از صفر این مقدار در سری کلی شمارشها دریافت میکنیم. بیایید از این روش بر روی یک عنصر از فهرست قبلی مورد بحث استفاده کنیم - نقش :System.out.println(Role.DIRECTOR.ordinal());
بر این اساس، کنسول نمایش می دهد:
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);
و کنسول نمایش خواهد داد:
76. متدهای ordinal() و compareTo() در Enum چگونه به هم مرتبط هستند؟
همانطور که قبلاً گفته شد، ordinal() عدد ترتیبی یک مقدار را در یک لیست شمارش عمومی برمیگرداند. همچنین در تجزیه و تحلیل سوال قبل مشاهده کردید که عناصر enumerations یکبار مثلاً در یک TreeSet (مجموعه مرتب شده) ترتیبی را می دهند که در enum اعلان می شوند . و همانطور که می دانیم، TreeSet و TreeMap عناصر را با فراخوانی متد ()compareTo در رابط Comparable مرتب می کنند . از این رو میتوانیم فرض کنیم که کلاس Enum رابط Comparable را پیادهسازی میکند و آن را در متد compareTo() پیادهسازی میکند ، که در آن از ()ordinal برای تنظیم ترتیب مرتبسازی استفاده میشود. پس از ورود به کلاس Enum ، تأیید این را می بینیم: و بدنه خود متد: متد ordinal() در اینجا فراخوانی نمی شود. در عوض، از متغیر ترتیبی استفاده می شود - عدد ترتیبی عنصر در شمارش. متد ()ordinal خود چیزی بیش از یک دریافت کننده برای متغیر ترتیبی نیست .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);
}
کنسول خروجی زیر را نمایش می دهد:
Stream API
80. Stream در جاوا چیست؟
جاوا استریم یک روش نسبتاً جدید برای تعامل با یک جریان داده است که به نوبه خود به شما امکان می دهد تا داده های بزرگ را راحت تر و فشرده تر پردازش کنید و همچنین پردازش داده ها را بین تعداد معینی از رشته ها موازی کنید که می تواند عملکرد را در استفاده افزایش دهد. عملکرد. این موضوع را نمی توان به طور خلاصه و عمیق تر مورد بحث قرار داد، بنابراین من در اینجا پیوندی به مقاله ای می گذارم که می تواند به شما کمک کند در این موضوع شیرجه بزنید.81. خواص اصلی معاملات چیست؟
این موضوع Stream API نام دارد، اما سوال در مورد تراکنش است. هوم... ابتدا بیایید بفهمیم که تراکنش چیست. تراکنش گروهی از عملیات پایگاه داده متوالی است که واحد منطقی کار با داده ها را نشان می دهد. یک تراکنش می تواند به طور کامل و با موفقیت انجام شود و یکپارچگی داده ها حفظ شود و مستقل از سایر تراکنش هایی که به صورت موازی انجام می شوند، یا اصلاً نمی توانند تکمیل شوند، در این صورت هیچ تاثیری ندارد. بنابراین، معاملات دارای چهار ویژگی اصلی هستند که به اختصار ACID نامیده می شود . بیایید ببینیم که هر حرف از این مخفف چگونه مخفف است: A - Atomicity - Atomicity - این ویژگی تضمین می کند که هیچ تراکنش به طور جزئی در سیستم ثبت نخواهد شد. یا تمام عملیات فرعی آن انجام خواهد شد، یا هیچ یک ( همه یا هیچ ) انجام نخواهد شد. ج - سازگاری - سازگاری خاصیتی است که تضمین می کند هر تراکنش موفق فقط نتایج معتبر را ثبت می کند. یعنی این تضمینی است که در صورت موفقیت آمیز بودن تراکنش، تمام قوانین و محدودیت هایی که سیستم بر روی داده های خاص اعمال می کند رعایت می شود، در غیر این صورت تراکنش کامل نمی شود و داده های موجود در سیستم به حالت قبلی خود باز می گردند. حالت. I - Isolation - Isolation خاصیتی است که می گوید در حین انجام معامله، معاملات موازی نباید در نتیجه آن تأثیر بگذارد. این ویژگی به منابع فشرده است، بنابراین به طور معمول تا حدی با اجازه دادن به سطوح خاصی از عایق که مشکلات عایق خاصی را حل می کند، اجرا می شود. در سوال بعدی به تفصیل در این مورد بحث خواهیم کرد. د - دوام - این خاصیت تضمین می کند که اگر کاربر تاییدیه ای مبنی بر انجام تراکنش از سیستم دریافت کرده باشد، می تواند مطمئن باشد که تغییراتی که انجام داده است به دلیل برخی خرابی ها لغو نخواهد شد. به این معنی که اگر قبلاً تأیید موفقیت آمیز بودن تراکنش خود را دریافت کرده باشید، می توانید مطمئن باشید که نوعی خرابی سیستم عامل هیچ کاری برای داده های شما نخواهد داشت.82. سطوح جداسازی معاملات چیست؟
همانطور که قبلاً گفتم، ارائه جداسازی ACID یک فرآیند فشرده منابع است. بنابراین این ملک تا حدودی راضی است. سطوح مختلفی از انزوا وجود دارد و هر چه این سطح بالاتر باشد، تأثیر بیشتری بر بهره وری دارد. قبل از حرکت به سطوح جداسازی تراکنش، باید به مشکلات مختلف جداسازی ناکافی تراکنش توجه کنیم :-
خواندن فانتوم - وقتی همان نمونه (همان پرس و جو) به طور مکرر در یک تراکنش فراخوانی می شود، داده های دریافتی متفاوت است، که به دلیل درج داده ها توسط تراکنش دیگر رخ می دهد.
-
خواندن غیر تکراری - هنگامی که یک نمونه (همان پرس و جو) به طور مکرر در همان تراکنش فراخوانی می شود، داده های دریافتی متفاوت است، که به دلیل تغییرات (به روز رسانی) و حذف داده ها توسط تراکنش دیگر رخ می دهد.
-
خواندن کثیف - فرآیند خواندن دادههای اضافه شده یا تغییر یافته توسط تراکنشی که متعاقباً تأیید نشده است (به عقب برگشته است)، یعنی. خواندن داده های نامعتبر؛
-
به روز رسانی از دست رفته - هنگامی که تراکنش های مختلف داده های مشابهی را به طور همزمان تغییر می دهند، همه تغییرات به جز آخرین مورد از بین می روند (یادآور مشکل "شرایط مسابقه" در یک محیط چند رشته ای).
سطح انزوا | فانتوم خوانی | خواندن غیر تکراری | کثیف خواندن | به روز رسانی گم شده است |
---|---|---|---|---|
قابل سریال سازی | + | + | + | + |
تکراری خواندن | - | + | + | + |
خواندن متعهد | - | - | + | + |
بدون تعهد بخوانید | - | - | - | + |
هیچ یک | - | - | - | - |
83. تفاوت Statement و PreparedStatement چیست؟
و در اینجا انتقال بسیار آرامی به ویژگی های فناوری JDBC وجود ندارد . بنابراین، ابتدا بیایید بفهمیم که بیانیه در واقع چیست . این یک شی است که برای تولید پرس و جوهای SQL استفاده می شود. JDBC از سه نوع استفاده می کند - Statement , PreparedStatement و CallableStatement . ما امروز به CallableStatement نگاه نمی کنیم : بیایید در مورد تفاوت بین Statement و PreparedStatement صحبت کنیم .-
بیانیه برای اجرای پرس و جوهای SQL ساده بدون پارامترهای ورودی و درج شده پویا استفاده می شود. PrepareStatement با قابلیت درج پویا پارامترهای ورودی استفاده می شود.
-
برای تنظیم پارامترها در PreparedStatement، پارامترهای ورودی در درخواست به صورت علامت سوال نوشته میشوند، به طوری که میتوان به جای آن یک مقدار با استفاده از تنظیمکنندههای مختلف مانند setDouble() , setFloat() , setInt() , setTime() درج کرد . . در نتیجه، نوع اشتباهی از داده ها را در پرس و جو خود وارد نمی کنید.
-
PreparedStatement "از پیش کامپایل شده" است و از کش استفاده می کند، بنابراین اجرای آن می تواند کمی سریعتر از پرس و جو از اشیاء Statement باشد . در نتیجه، پرس و جوهای SQL که به طور مکرر اجرا می شوند به عنوان اشیاء PreparedStatement برای بهبود عملکرد نوشته می شوند .
-
بیانیه در برابر تزریق SQL آسیب پذیر است، در حالی که PreparedStatement از آنها جلوگیری می کند. در این مقاله درباره حذف تزریق SQL و سایر بهترین روش ها در امنیت جاوا بیشتر بخوانید .
GO TO FULL VERSION