JavaRush /Java blogi /Random-UZ /Java dasturchisi uchun intervyudan olingan savollar va ja...

Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish. 8-qism

Guruhda nashr etilgan
Amaliyotmi yoki nazariyami? Nima muhimroq? Ko'pchilik, albatta, amaliyot muhimroq ekanini aytadi. Masalan, iloji boricha mashq qiling va siz baxtli bo'lasiz. Men bu fikrga qo'shilmaslikka jur'at etaman. Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  8-1-qismSuhbat davomida sizning amaliyotda qanchalik yaxshi ekanligingizni hech kim bilmaydi. Sizdan aniq nazariyaga ko'ra to'liq so'raladi. Va shundan keyingina, suhbatlarning barcha bosqichlaridan o'tib, loyihaga kirganingizda, amaliy ko'nikmalaringizdan foydalanasiz. Siz e'tiroz bildirishingiz mumkin: ba'zida ular sizga test topshirig'ini berishadi va amaliyot hali ham kerak. Men bahslashmayman, ular ba'zan beriladi, lekin ishning haqiqati shundaki, BA'ZAN, lekin nazariy intervyu HAR DOIMA bo'lib o'tadi. Farqni his qilyapsizmi? Shuning uchun, siz oyoqlaringiz ostida mustahkam nazariy poydevorga ega bo'lishingiz kerak, biz uni bugungi kunda mustahkamlashda davom etamiz. Aniqrog'i, biz suhbat davomida tez-tez beriladigan savollarni tahlil qilishni davom ettiramiz .

71. Enum uchun toString() usulini bekor qilmasak nima bo'ladi?

Aytaylik, bizda quyidagi raqam bor :
public enum Role {
   STUDENT,
   TEACHER,
   DIRECTOR,
   SECURITY_GUARD;
}
Talabani toString() ga qo'ng'iroq qilib konsolda ko'rsatamiz :
System.out.println(Role.STUDENT.toString());
Konsolda natija:
Talaba
Ya'ni, sukut bo'yicha, enum uchun toString() doimiyning o'zi nomidir.

72. Enum ichida konstruktorni belgilash mumkinmi?

Ha albatta. Konstruktor orqali ichki enum o'zgaruvchilari qiymatlari o'rnatiladi. Misol tariqasida, har bir rol uchun yosh oralig'ini ko'rsatish uchun oldingi raqamga ikkita maydon qo'shamiz - ageFrom va 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. == va teng() o'rtasidagi farq nima?

Bu Java dasturchi intervyusining eng keng tarqalgan savollaridan biridir. Keling, oddiy qiymatlarni solishtirganda ( int , char , double ...) biz buni == yordamida qilamiz , chunki o'zgaruvchilar ma'lum qiymatlarni o'z ichiga oladi va biz ularni taqqoslashimiz mumkin. Va ibtidoiy o'zgaruvchilar to'liq huquqli ob'ektlar emas - ular Object- dan meros emas va teng() usuliga ega emas . Ob'ektlarga tegishli bo'lgan o'zgaruvchilarni solishtirish haqida gapirganda, == faqat havolalar qiymatini solishtiradi - ular bir xil ob'ektga tegishlimi yoki yo'qmi. Va agar bitta ob'ekt boshqa ob'ekt bilan bir xil bo'lsa ham, == orqali taqqoslash salbiy natija beradi ( false ), chunki bu boshqa ob'ekt. Siz tushunganingizdek, mos yozuvlar o'zgaruvchilarni solishtirish uchun equals() usuli qo'llaniladi . Bu Ob'ekt sinfining standart usullaridan biri bo'lib , ob'ektlarni to'liq taqqoslash uchun zarurdir. Ammo darhol aniqlab olish kerak: bu usul to'g'ri ishlashi uchun ushbu sinf ob'ektlarini qanday solishtirish kerakligini yozish orqali uni qayta belgilash kerak. Usulni bekor qilmasangiz, sukut bo'yicha u ob'ektlarni == bilan taqqoslaydi . IntelliJ IDEA da siz uni avtomatik ravishda bekor qilishingiz mumkin (IDEA vositalaridan foydalangan holda) -> alt + insert , paydo bo'lgan oynada equals() va hashCode() ni tanlang -> qaysi sinf maydonlari ishtirok etishini tanlang -> va voila, avtomatik ravishda amalga oshirish usullari tugallandi. Bu yerda ikkita maydonga ega oddiy Cat klassi uchun avtomatik tarzda yaratilgan tenglashtirish usuli qanday ko'rinishiga misol keltiramiz - int age va 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);
}
Agar enumlar uchun == va tenglar o'rtasidagi farq haqida gapiradigan bo'lsak , unda unchalik ko'p emas. Axir, enum konstantalarni saqlaydi va hatto == yordamida o'xshash qiymatlarni taqqoslaganda ham biz true ni olamiz , chunki havolalar har doim bir xil ob'ektlarga tegishli bo'ladi. Xo'sh, tenglardan foydalanganda biz funksionallikni ham to'g'ri ishlab chiqamiz, ayniqsa enum uchun tenglar usulining tanasiga kirsangiz , Enum sinfida usulning amalga oshirilishi quyidagicha ekanligini ko'rasiz : Ya'ni, ichida - mos yozuvlar bo'yicha yaxshi eski taqqoslash! Xulosa qilish uchun: enum uchun == va teng orqali taqqoslash to'g'ri.Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  8-2 qismJava dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  8-3 qismJava dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  8-4-qism

74. Enumda ordinal() usuli nima qiladi?

Enum elementida int ordinal() usulini chaqirganda , biz umumiy ro'yxatlar qatoridagi ushbu qiymatning noldan tartib raqamini olamiz. Keling, ushbu usulni avvalgi muhokama qilingan elementning bitta elementida ishlatamiz - Rol :
System.out.println(Role.DIRECTOR.ordinal());
Shunga ko'ra, konsolda ko'rsatiladi:
2

75. Java-da TreeSet yoki TreeMap bilan Enum dan foydalanish mumkinmi?

TreeSet va TreeMap da enum turlaridan foydalanishga ruxsat beriladi. Va biz yozishimiz mumkin:
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);
Va konsolda ko'rsatiladi:
TALABA O'QITUVCHI DIREKTOR XAVFSIZLIK_QO'SHI
Biz chiqishni alifbo tartibida emas, oldik. Gap shundaki, agar biz TreeSet qiymatlari uchun enum elementlarini yoki TreeMap kalitlari sifatida foydalansak, elementlar tabiiy tartibda saralanadi ( enumda ko'rsatilgan tartibda ). Ushbu xususiyatlarni tushunish bizga yaxshiroq kod yozishga yordam beradi.Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  8-5-qism

76. Enumda ordinal() va compareTo() usullari qanday bog'langan?

Yuqorida aytib o'tilganidek, ordinal() umumiy ro'yxatdagi qiymatning tartib raqamini qaytaradi. Bundan tashqari, oldingi savolni tahlil qilishda siz sanab o'tish elementlari, masalan, TreeSet (tartiblangan to'plam) da bir marta enumda e'lon qilingan tartibni olganini ko'rdingiz . Bizga ma'lumki, TreeSet va TreeMap elementlarni Comparable interfeysining compareTo() usulini chaqirish orqali tartiblaydi . Bundan kelib chiqib, Enum klassi Comparable interfeysini amalga oshiradi , uni compareTo() usulida amalga oshiradi , uning ichida tartiblash tartibini o'rnatish uchun ordinal() ishlatiladi. Enum sinfiga kirganimizdan so'ng , biz buning tasdig'ini ko'ramiz: Va usulning o'zi: ordinal() usuli bu erda chaqirilmaydi. Buning o'rniga tartib o'zgaruvchisi - sanabdagi elementning tartib raqami ishlatiladi. ordinal() usulining o'zi ordinal o'zgaruvchini oluvchidan boshqa narsa emas .Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  8-6-qismJava dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  8-7 qismJava dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  8-8-qism

77. EnumM misolini yozing

Yuqorida muhokama qilingan savollarda men allaqachon enumlarga misollar keltirdim va kodni takrorlashning ma'nosini ko'rmayapman (masalan, enumdagi konstruktor haqida 72-savol).

78. Enum dan switch korpusida foydalanish mumkinmi?

Bu mumkin va zarur! Amaliyotimga nazar tashlaydigan bo'lsam, enumni ishlatish uchun eng keng tarqalgan joylardan biri switch kabi mantiqiy konstruktsiyalar ekanligini ta'kidlayman . Bunday holda, siz case ning barcha mumkin bo'lgan o'zgarishlarini taqdim etishingiz mumkin va barcha enum qiymatlari uchun mantiqni yozganingizdan so'ng - standart operatordan foydalanish ham kerak bo'lmasligi mumkin! Axir, agar siz String yoki raqamli qiymatdan foydalansangiz, masalan, int tipidagi , siz kutilmagan qiymat olishingiz mumkin, bu esa o'z navbatida enum yordamida mumkin emas . Yuqorida muhokama qilingan misol uchun kalit qanday ko'rinishga ega bo'ladi :
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 misolida barcha mavjud qiymatlarni qanday olish mumkin?

Agar siz raqamning barcha nusxalarini olishingiz kerak bo'lsa, ma'lum bir raqamning barcha mavjud qiymatlari qatorini tabiiy tartibda qaytaradigan values ​​​​() usuli mavjud (ular enumda ko'rsatilgan tartibda ). Misol:
Role[] roles = Role.values();
for (Role role : roles) {
   System.out.println(role);
}
Konsol quyidagi chiqishni ko'rsatadi:
TALABA O'QITUVCHI DIREKTOR XAVFSIZLIK_QO'SHI

Stream API

80. Java tilidagi Stream nima?

Java Stream - bu ma'lumotlar oqimi bilan o'zaro ta'sir qilishning nisbatan yangi usuli bo'lib, u o'z navbatida katta ma'lumotlarni yanada qulay va ixcham qayta ishlashga, shuningdek ma'lumotlarga ishlov berishni ma'lum miqdordagi iplar o'rtasida parallellashtirishga imkon beradi, bu esa foydalanish samaradorligini oshirishi mumkin. funksionallik. Ushbu mavzuni qisqacha chuqurroq muhokama qilib bo'lmaydi, shuning uchun men bu erda sizga ushbu mavzuga sho'ng'ishga yordam beradigan maqolaga havolani qoldiraman.Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  8-9-qism

81. Bitimlarning asosiy xossalari nimalardan iborat?

Mavzu Stream API deb ataladi, ammo savol tranzaksiya haqida. Hmm... Birinchidan, tranzaksiya nima ekanligini aniqlaymiz. Tranzaksiya ma'lumotlar bilan ishlashning mantiqiy birligini ifodalovchi ketma-ket ma'lumotlar bazasi operatsiyalari guruhidir. Tranzaktsiya to'liq va muvaffaqiyatli bajarilishi mumkin, ma'lumotlar yaxlitligini saqlagan holda va parallel ravishda amalga oshiriladigan boshqa tranzaktsiyalardan mustaqil ravishda amalga oshirilishi mumkin yoki uni umuman bajarib bo'lmaydi, bu holda u hech qanday ta'sir ko'rsatmaydi. Shunday qilib, tranzaktsiyalar to'rtta asosiy xususiyatga ega, ular qisqacha ACID deb ataladi . Keling, ushbu qisqartmaning har bir harfini qanday ifodalashini ko'rib chiqaylik: A - Atomicity - atomicity - bu xususiyat tizimda hech qanday tranzaksiya qisman qayd etilmasligini kafolatlaydi. Yoki uning barcha kichik operatsiyalari bajariladi yoki hech biri bajarilmaydi ( hammasi yoki hech narsa ). C - izchillik - izchillik har bir muvaffaqiyatli tranzaksiya faqat haqiqiy natijalarni qayd etishini ta'minlaydigan xususiyatdir. Ya'ni, bu tranzaksiya muvaffaqiyatli amalga oshirilgan taqdirda tizim muayyan ma'lumotlarga qo'yadigan barcha qoidalar va cheklovlar bajarilishini kafolatlaydi, aks holda tranzaktsiya tugallanmaydi va tizimdagi ma'lumotlar avvalgisiga qaytadi. davlat. I - Izolyatsiya - izolyatsiya - bu bitimni amalga oshirish jarayonida parallel operatsiyalar uning natijasiga ta'sir qilmasligi kerakligini aytadigan xususiyat. Bu xususiyat resursni talab qiladi, shuning uchun u odatda ma'lum izolyatsiyalash muammolarini hal qiladigan ma'lum darajadagi izolyatsiyaga ruxsat berish orqali qisman amalga oshiriladi. Buni keyingi savolda batafsilroq muhokama qilamiz. Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  8-10-qismD - chidamlilik - bu xususiyat agar foydalanuvchi tizimdan tranzaksiya yakunlanganligi haqidagi tasdiqni olgan bo'lsa, u amalga oshirgan o'zgarishlar qandaydir nosozlik tufayli bekor qilinmasligiga ishonch hosil qilishini ta'minlaydi. Ya'ni, agar siz tranzaksiya muvaffaqiyatli yakunlanganligi haqidagi tasdiqnomani olgan bo'lsangiz, operatsion tizimning qandaydir nosozliklari ma'lumotlaringizga hech narsa qilmasligiga amin bo'lishingiz mumkin.

82. Tranzaksiyalarni izolyatsiyalash darajalari qanday?

Yuqorida aytib o'tganimdek, ACID izolyatsiyasini ta'minlash resurslarni talab qiladigan jarayondir. Shuning uchun bu mulk qisman qondiriladi. Izolyatsiyaning turli darajalari mavjud va qanchalik baland bo'lsa, unumdorlikka ta'siri shunchalik ko'p bo'ladi. Tranzaktsiyalarni izolyatsiya qilish darajalariga o'tishdan oldin, tranzaktsiyalarni izolyatsiya qilishning turli muammolarini ko'rib chiqishimiz kerak :
  • fantom o'qish - bir xil namuna (xuddi shu so'rov) bir xil tranzaksiya doirasida qayta-qayta chaqirilganda, olingan ma'lumotlar farqlanadi, bu boshqa tranzaksiya tomonidan ma'lumotlarni kiritish natijasida yuzaga keladi;

  • takrorlanmaydigan o'qish - bir xil tranzaksiya doirasida bir xil namuna (bir xil so'rov) qayta-qayta chaqirilganda, boshqa tranzaksiya tomonidan ma'lumotlarning o'zgarishi (yangilanishi) va o'chirilishi tufayli yuzaga keladigan olingan ma'lumotlar farqlanadi;

  • iflos o'qish - keyinchalik tasdiqlanmagan (orqaga qaytarilgan) tranzaksiya tomonidan qo'shilgan yoki o'zgartirilgan ma'lumotlarni o'qish jarayoni, ya'ni. noto'g'ri ma'lumotlarni o'qish;

  • yo'qolgan yangilanish - turli tranzaktsiyalar bir vaqtning o'zida bir xil ma'lumotlarni o'zgartirganda, oxirgisidan tashqari barcha o'zgarishlar yo'qoladi (ko'p tarmoqli muhitda "poyga holati" muammosini eslatadi).

Tranzaksiyalarni izolyatsiyalash darajalari ular qanday izolyatsiya muammolaridan himoya qilishlari bilan tavsiflanadi. Keling, jadval shaklida izolyatsiya darajalarini va ular qanday muammolardan himoya qilishini ko'rib chiqaylik:
Izolyatsiya darajasi Fantom o'qish Takrorlanmaydigan o'qish Nopok o'qish Yo'qotilgan yangilanish
SERIAL BO'LADI + + + +
KAYTARILAN O'QISH - + + +
O'QING - - + +
O'QIShSIZ - - - +
YO'Q - - - -
Va tanganing boshqa tomonini unutmang: izolyatsiya darajasi qanchalik baland bo'lsa, tranzaktsiyalar shunchalik uzoq davom etadi (agar bir nechta tranzaktsiyalar parallel ravishda amalga oshirilsa). Agar siz ushbu mavzuni chuqurroq o'rganishni istasangiz, bu erda sizni boshlash uchun ajoyib maqola .

83. Bayonot va PreparedStatement o'rtasidagi farq nima?

Va bu erda JDBC texnologiyasining xususiyatlariga juda silliq o'tish yo'q . Shunday qilib, avvalo, bayonot nima ekanligini aniqlaylik . Bu SQL so'rovlarini yaratish uchun ishlatiladigan ob'ekt. JDBC uchta turdan foydalanadi - bayonot , PreparedStatement va CallableStatement . Biz bugun CallableStatement-ni ko'rib chiqmaymiz : keling, Statement va PreparedStatement o'rtasidagi farq haqida gapiraylik .
  1. Bayonot oddiy SQL so'rovlarini kiruvchi, dinamik kiritilgan parametrlarsiz bajarish uchun ishlatiladi. PrepareStatement kirish parametrlarini dinamik ravishda kiritish imkoniyati bilan ishlatiladi.

  2. PreparedStatement- da parametrlarni o'rnatish uchun so'rovdagi kirish parametrlari savol belgisi sifatida yoziladi, shunda qiymat o'rniga setDouble() , setFloat() , setInt() , setTime() kabi turli xil sozlagichlar yordamida kiritilishi mumkin ... . Natijada, siz so'rovingizga noto'g'ri turdagi ma'lumotlarni kiritmaysiz.

  3. PreparedStatement "oldindan kompilyatsiya qilingan" va keshlashdan foydalanadi, shuning uchun uning bajarilishi Statement ob'ektlaridan so'rovlarga qaraganda biroz tezroq bo'lishi mumkin . Natijada, tez-tez bajariladigan SQL so'rovlari ishlashni yaxshilash uchun PreparedStatement ob'ektlari sifatida yoziladi .

  4. Bayonot SQL inyeksiyalariga nisbatan zaif, PreparedStatement esa ularni oldini oladi. Ushbu maqolada Java xavfsizligi bo'yicha SQL in'ektsiyalarini va boshqa eng yaxshi amaliyotlarni yo'q qilish haqida ko'proq o'qing .

Agar siz Java dasturini JDBC ma'lumotlar bazasiga ulash texnologiyasini o'rganishni boshlayotgan bo'lsangiz, men sizga ushbu maqoladan boshlashingizni maslahat beraman . Xo'sh, bu erda biz bugun to'xtatamiz.Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 8 - 11
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION