
71. اگر متد ()toString Enum را لغو نکنیم چه اتفاقی می افتد؟
فرض کنید عدد زیر را داریم :public enum Role {
STUDENT,
TEACHER,
DIRECTOR,
SECURITY_GUARD;
}
بیایید با فراخوانی متد toString() فیلد STUDENT را در کنسول نمایش دهیم :
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 . در پنجره ای که ظاهر می شود، ()quals و ()hashCode را انتخاب کنید . سپس زمینه هایی را که باید درگیر شوند انتخاب کنید. وویلا! روش ها به صورت خودکار پیاده سازی می شوند. در اینجا نمونهای از این است که چگونه یک متد برابر با تولید خودکار به دنبال سادهترین کلاس 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);
}
وقتی صحبت از enum به میان می آید، تفاوت عملی بین == و برابر () وجود ندارد . 


74. متد ()ordinal Enum چه کاری انجام می دهد؟
هنگامی که متد int ordinal() را در یک فیلد enum فراخوانی می کنیم ، ایندکس مبتنی بر صفر فیلد را در لیست مقادیر enum دریافت می کنیم. بیایید این متد را در فیلدی در Role 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() شاخص یک فیلد را در لیست فیلدهای enum برمی گرداند. همچنین، در بررسی سؤال قبلی، دیدید که وقتی فیلدهای enum در یک TreeSet (که یک مجموعه مرتب شده است) قرار می گیرند، ترتیبی را که در enum اعلام می شوند، به خود می گیرند . و همانطور که می دانیم، TreeSet و TreeMap آیتم ها را با فراخوانی متد compareTo() رابط Comparable خود مرتب می کنند . این به ما می گوید که کلاس Enum رابط Comparable را پیاده سازی می کند ، به این معنی که متد compareTo() را پیاده سازی می کند، که به صورت داخلی از متد ()ordinal برای تعیین ترتیب مرتب سازی استفاده می کند. با رفتن به کلاس Enum ، میتوانیم فرض خود را تأیید کنیم:


77. یک مثال Enum بنویسید
در سؤالاتی که در بالا بحث شد، من قبلاً نمونه هایی از enum s را آورده ام. من دلیلی برای تکرار کد در اینجا نمی بینم. به عنوان مثال، به سوال 72 در مورد سازنده در enum مراجعه کنید.78. آیا می توان از Enum در کیس سوئیچ استفاده کرد؟
می تواند باشد و باید باشد! با نگاهی به تجربه خود، متذکر می شوم که یکی از رایج ترین کاربردهای enum در ساختارهای منطقی مانند دستورات سوئیچ است . در این مورد، شما می توانید تمام موارد ممکن را ارائه دهید - زمانی که منطق هر فیلد enum را بنویسید ، حتی به یک بند پیش فرض نیاز ندارید ! به هر حال، اگر از String یا یک مقدار عددی مانند int استفاده کنید ، ممکن است مقدار غیرمنتظره ای دریافت کنید، اما با enum غیرممکن است . در اینجا یک عبارت switch برای مثال بالا به نظر می رسد:public void doSomething(Role role) {
switch (role) {
case STUDENT:
// some logic for STUDENT
break;
case TEACHER:
// some logic for TEACHER
break;
case DIRECTOR:
// some logic for DIRECTOR
break;
case SECURITY_GUARD:
// some logic for SECURITY_GUARD
break;
}
}
79. چگونه می توانم تمام مقادیر ممکن یک Enum را بدست بیاورم؟
اگر نیاز دارید که تمام مقادیر enum ممکن را بدست آورید، یک متد values() وجود دارد که آرایه ای از تمام مقادیر ممکن را برای enum به ترتیب طبیعی آنها برمی گرداند (یعنی به ترتیبی که در enum مشخص شده اند ) . مثال:Role[] roles = Role.values();
for (Role role : roles) {
System.out.println(role);
}
ما موارد زیر را در کنسول خواهیم داشت:
Stream API
80. استریم در جاوا چیست؟
Java Stream API یک روش نسبتاً جدید برای تعامل با جریان داده است که به ما امکان می دهد داده های بزرگ را راحت تر و فشرده تر پردازش کنیم و همچنین داده ها را به صورت موازی در بین تعدادی از جریان ها پردازش کنیم که به طور بالقوه عملکرد را افزایش می دهد.81. خواص اصلی معاملات را نام ببرید
موضوع در اینجا Stream API است، اما سوال در مورد تراکنش ها است. هوم... ابتدا بیایید بفهمیم تراکنش چیست. تراکنش مجموعه ای از عملیات متوالی در پایگاه داده است . این یک واحد منطقی کار را نشان می دهد. یک تراکنش می تواند مستقل از سایر تراکنش های همزمان یا به طور کامل و با موفقیت اجرا شود، در نتیجه یکپارچگی داده ها حفظ شود، یا اصلاً اجرا نشود، در این صورت هیچ تاثیری ندارد. تراکنش ها دارای چهار ویژگی اصلی هستند که به لطف نام اختصاری ACID می توانیم به راحتی آنها را به خاطر بسپاریم . بیایید ببینیم هر حرف از این مخفف به چه معناست: A مخفف Atomicity است . این ویژگی تضمین می کند که هیچ معامله ای در سیستم انجام نشده است. یا تمام عملیات فرعی آن اجرا می شود یا هیچ یک از آنها اجرا نمی شود ( همه یا هیچ ). С مخفف Consistency است . این ویژگی تضمین می کند که هر تراکنش موفق فقط نتایج معتبری را به همراه خواهد داشت. به عبارت دیگر، این تضمینی است که در صورت موفقیت آمیز بودن تراکنش، تمام قوانین سیستم برای داده های خاص رعایت می شود. در صورت عدم موفقیت تراکنش، آنگاه اجرا نمی شود و داده های سیستم به حالت قبلی خود باز می گردند. من مخفف Isolation است . این ویژگی به این معنی است که وقتی یک تراکنش اجرا می شود، تراکنش های همزمان نباید بر نتیجه آن تأثیر بگذارد. این ویژگی منبع فشرده است، بنابراین، به عنوان یک قاعده، تا حدی اجرا می شود، اجازه می دهد تا سطوح خاصی از جداسازی را حل کند که مشکلات جداسازی خاص را حل می کند. در سوال بعدی در این مورد با جزئیات بیشتر صحبت خواهیم کرد. D مخفف دوام است . این ویژگی تضمین میکند که اگر کاربر تأییدی مبنی بر انجام تراکنش دریافت کند، میتواند مطمئن باشد که تغییرات به دلیل عدم موفقیت لغو نمیشوند. به این معنی که اگر قبلاً تأییدیه ای مبنی بر موفقیت آمیز بودن تراکنش دریافت کرده باشید، می توانید مطمئن باشید که برخی از خرابی های سیستم عامل هیچ کاری برای داده های شما نخواهد داشت.82. سطوح جداسازی معاملات چیست؟
همانطور که قبلاً گفتم، وقتی صحبت از ویژگیهای ACID میشود، اطمینان از جداسازی یک فرآیند فشرده منابع است. بر این اساس این اموال تا حدی اجرا می شود. سطوح مختلفی از انزوا وجود دارد: هر چه سطح بالاتر باشد، تأثیر شدیدتری بر عملکرد خواهد داشت. قبل از اینکه به سطوح جداسازی تراکنش ها برویم، باید مشکلات مختلفی را که به دلیل جداسازی ناکافی تراکنش رخ می دهد، در نظر بگیریم :-
فانتوم میخواند : زمانی که یک درخواست، که بیش از یک بار در یک تراکنش فراخوانی میشود، نتایج متفاوتی بهدلیل درجگذاری توسط تراکنش دیگر به دست میدهد.
-
تکرار نشدنی می خواند : زمانی که یک درخواست، که بیش از یک بار در یک تراکنش فراخوانی می شود، داده های متفاوتی را به دلیل تغییرات (به روز رسانی) و حذف توسط تراکنش دیگر به دست می دهد.
-
خواندههای کثیف : خواندن دادههای هنوز غیرمتعهد که توسط یک تراکنش اضافه یا اصلاح شدهاند و متعاقباً برگشت داده میشوند.
-
به روز رسانی های از دست رفته : زمانی که یک بلوک داده به طور همزمان توسط تراکنش های مختلف تغییر می کند و همه تغییرات به جز آخرین مورد از بین می روند (مشابه شرایط مسابقه در چند رشته ای).
سطح انزوا | فانتوم می خواند | خواندن های تکرار نشدنی | کثیف می خواند | به روز رسانی گم شده است |
---|---|---|---|---|
قابل سریال سازی | + | + | + | + |
تکراری خواندن | - | + | + | + |
خواندن متعهد | - | - | + | + |
بدون تعهد بخوانید | - | - | - | + |
هیچ یک | - | - | - | - |
83. تفاوت بین یک بیانیه و یک بیانیه آماده چیست؟
در اینجا ما به طور ناگهانی انتقال به ویژگی های JDBC را تغییر داده ایم . در هر صورت، ابتدا بیایید بفهمیم که بیانیه چیست. این یک شی است که برای تشکیل پرس و جوهای SQL استفاده می شود. JDBC از سه نوع استفاده می کند: Statement ، PreparedStatement و CallableStatement . ما امروز CallableStatement را در نظر نخواهیم گرفت . در عوض، ما در مورد تفاوت بین Statement و PreparedStatement صحبت می کنیم .-
بیانیه برای اجرای کوئری های ساده SQL بدون پارامترهای ورودی زمان اجرا استفاده می شود. PrepareStatement می تواند پارامترهای ورودی را در زمان اجرا بپذیرد.
-
برای تنظیم پارامترها برای PreparedStatement ، پارامترهای ورودی به صورت علامت سوال در درخواست نوشته میشوند، بنابراین میتوان آنها را با مقداری با استفاده از تنظیمکنندههای مختلف جایگزین کرد، مانند setDouble() , setFloat() , setInt() , setTime() ... این به این معنی است که شما نوع اشتباهی از داده ها را در درخواست وارد نمی کنید.
-
PreparedStatement از قبل کامپایل شده است و از کش استفاده می کند، بنابراین می توان آن را کمی سریعتر از درخواستی که از اشیاء Statement انجام می شود، اجرا کرد . در نتیجه، دستورات SQL که به طور مکرر اجرا می شوند، به عنوان اشیاء PreparedStatement به منظور بهبود عملکرد ایجاد می شوند.
-
بیانیه در برابر تزریق SQL آسیب پذیر است، اما PreparedStatement از آنها جلوگیری می کند.
GO TO FULL VERSION