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

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

Guruhda nashr etilgan
Salom Dunyo! Rivojlanishni davom ettirish har qanday ishlab chiquvchi uchun juda muhimdir. Axir, agar siz to'xtasangiz, da'vosiz bo'lib qolish va bozordan butunlay uchib ketish xavfi mavjud: IT olami doimo rivojlanib, oldinga siljiydi va siz u bilan harakat qilishingiz kerak. Ammo shu bilan birga, klassika (klassik mavzular) haqida unutmaslik uchun faqat yangi va yangi texnologiyalarga e'tibor qaratish mumkin emas. Bugun men Java dasturchisi uchun "klassik" mavzulardagi savollarni tahlil qilishni davom ettirmoqchiman. Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  6-1-qismShuni ta'kidlaymanki, mening javoblarim yakuniy vakolat emas - men bu savollarga to'g'ri javoblarni shunday ko'raman va siz ulardan ba'zilari bilan rozi bo'lmasligingiz mumkin. Bu juda normal bo'ladi, shuning uchun fikringizni sharhlarda baham ko'ring. Tahlil qismlariga havolalar maqolaning oxirida.Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  6-2 qism

Kutubxonalar va standartlar

52. Hibernate nima? JPA va Hibernate o'rtasidagi farq nima?

O'ylaymanki, bu savolga javob berish uchun birinchi navbatda JPA nima ekanligini tushunishimiz kerak . JPA - bu oddiy Java ob'yektlarining ob'ektga aloqador xaritasini tavsiflovchi spetsifikatsiya va bunday ob'ektlarni saqlash, olish va boshqarish uchun API taqdim etadi. Ya'ni, biz eslayotganimizdek, relyatsion ma'lumotlar bazalari (MB) ko'plab o'zaro bog'langan jadvallar shaklida taqdim etiladi. JPA esa ob'ektlarning relyatsion ma'lumotlar bazalari bilan o'zaro ta'sirini tavsiflovchi keng tarqalgan standartdir. Ko'rib turganingizdek, JPA mavhum va nomoddiy narsadir. Bu g'oyaning o'zi, yondashuv kabi. Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  6-3 qismShu bilan birga, Hibernate JPA paradigmalarini amalga oshiradigan maxsus kutubxonadir . Ya'ni, ushbu kutubxona yordamida siz ma'lumotlar bazasidan (Entity) ma'lumotlarni ifodalovchi ob'ektlar orqali relyatsion ma'lumotlar bazasi bilan ishlashingiz mumkin. Ular aytganidek, bu kutubxona JPA ideallariga juda yaqin va shuning uchun u mashhur bo'ldi. Va siz tushunganingizdek, foydalanishning mashhurligi keyingi rivojlanish va takomillashtirish uchun yaxshi dalildir. Bundan tashqari, uni tez-tez ishlatish ortida ushbu vosita bilan bog'liq barcha mumkin bo'lgan va mumkin bo'lmagan savollarni allaqachon saralagan ulkan jamoa mavjud. Mana, ushbu texnologiyaning barcha qorong'u burchaklarini batafsil ko'rib chiqadigan kitobning namunasi . Ya'ni, Hibernate imkon qadar ko'proq o'rganilgan va ma'lum bo'lishicha, ishonchli. Aslida, JPA-ning bahor tomonida ideal tarzda amalga oshirilishi odatda kaput ostida Hibernate-dan foydalanishi bejiz emas.

53. Kaskad deb nimaga aytiladi? U Hibernate rejimida qanday ishlatiladi?

Yuqorida aytib o'tganimdek, kutish rejimida aloqa ob'ektlar deb ataladigan ma'lumotlar ob'ektlari orqali amalga oshiriladi . Ushbu ob'ektlar ma'lumotlar bazasidagi ba'zi maxsus jadvallarni ifodalaydi va siz eslayotganingizdek, Java sinflarida boshqa sinflarga havolalar bo'lishi mumkin. Bu munosabatlar ma'lumotlar bazasida aks ettirilgan. Ma'lumotlar bazasida, qoida tariqasida, bular chet el kalitlari (OneToOne, OneToMany, ManyToOne uchun) yoki oraliq jadvallar (ManyToMany uchun).Siz ushbu maqolada ob'ektlar o'rtasidagi munosabatlar haqida ko'proq o'qishingiz mumkin . Tashkilotingiz boshqa tegishli ob'ektlarga havolalarga ega bo'lsa, ulanish turini ko'rsatish uchun izohlar ushbu havolalar ustiga qo'yiladi: @OneToOne, @OneToMany, @ManyToOne, @ManyToMane, ularning parametrlarida siz mulk qiymatini belgilashingiz mumkin - kaskad - bu ulanish uchun kaskad turi. JPA ob'ektlar bilan o'zaro ishlashning o'ziga xos usullariga ega (doimiy turish, saqlash, birlashtirish ...) . Kaskadli turlar maqsadli ob'ektda ushbu usullardan foydalanilganda bog'langan ma'lumotlar qanday harakat qilishini ko'rsatish uchun aniq ishlatiladi. Xo'sh, kaskadli strategiyalar (kaskad turlari) qanday? JPA standarti olti turdagi kaskadlardan foydalanishni nazarda tutadi:
  • PERSIST - saqlash operatsiyalari kaskadda amalga oshiriladi ( save() va persist() usullari uchun ). Ya'ni, agar biz boshqa ob'ektlar bilan bog'langan ob'ektni saqlasak, ular ham ma'lumotlar bazasida saqlanadi (agar ular hali mavjud bo'lmasa)

  • MERGE - yangilash operatsiyalari kaskadda amalga oshiriladi ( birlashma() usuli uchun )

  • REMOVE - olib tashlash operatsiyalari kaskadda sodir bo'ladi ( remove() usuli )

  • ALL - bir vaqtning o'zida uchta kaskad operatsiyalarini o'z ichiga oladi - DAVO'AT - BIRISH - O'chirish

JPA doimiy ob'ekt tushunchasiga ega - joriy sessiya (ulanish) tomonidan boshqariladigan ma'lumotlar bazasidagi ma'lumotlari bilan bog'langan ob'ekt . Agar siz uni o'zgartirsangiz, lekin o'zgarishlarni ma'lumotlar bazasida saqlamasangiz, uning ma'lumotlar bazasidagi ma'lumotlari o'zgartiriladi.
  • DETACH bilan bog'liq ob'ektlar seans tomonidan boshqarilmaydi ( detach() usuli ). Ya'ni, ular o'zgarganda, ma'lumotlar bazasida ularning ma'lumotlarida avtomatik o'zgarishlar bo'lmaydi - ular qat'iylik holatidan ajratilgan (JPA tomonidan boshqarilmaydigan ob'ekt) holatiga o'tkaziladi.

  • YANGILASH - har safar ob'ekt ma'lumotlar bazasidan ma'lumotlar bilan yangilanganda ( refresh() - ajratilgan ob'ektlarni yangilaydi), tegishli ob'ektlar xuddi shu tarzda yangilanadi. Masalan, siz qandaydir tarzda ma'lumotlar bazasidan olingan ma'lumotlarni o'zgartirdingiz va uning asl qiymatlarini qaytarishni xohlaysiz. Bunday holda, ushbu operatsiya siz uchun foydali bo'ladi.

Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  6-4-qismHibernate ushbu standart kaskad operatsiyalarining barchasini qo'llab-quvvatlaydi, lekin uchtasini ham taqdim etadi:
  • REPLICATE - Bizda bir nechta ma'lumotlar manbalari mavjud bo'lganda foydalaniladi va biz ma'lumotlarni sinxronlashtirishni xohlaymiz (Hibernate usuli - replikatsiya). Barcha ob'ektlar identifikatorlariga (id) ega bo'lishi kerak, shuning uchun ularni yaratishda hech qanday muammo bo'lmasligi kerak (bir xil ob'ekt turli ma'lumotlar bazalari uchun turli identifikatorlarga ega bo'lmasligi uchun)

  • SAVE_UPDATE - kaskadli saqlash/o'chirish (Hibernate usuli uchun - saveOrUpdate )

  • LOCK - DETACHED ga teskari operatsiya : u ajratilgan ob'ektni doimiylik holatiga qaytaradi , ya'ni. ob'ekt joriy seans tomonidan yana kuzatiladi

Agar kaskad turi tanlanmagan bo'lsa, ob'ektdagi hech qanday operatsiya u bilan bog'langan boshqa ob'ektlarga ta'sir qilmaydi.

54. Entity sinfi mavhum bo'lishi mumkinmi?

JPA spetsifikatsiyasining 2.1 -bandida " Entity Class" qatori mavjud: " Ham mavhum, ham aniq sinflar ob'ektlar bo'lishi mumkin ." Demak, javob ha, mavhum sinf ob'ekt bo'lishi mumkin va @Entity bilan izohlanishi mumkin.

55. Korxona boshqaruvchisi nima? U nima uchun javobgar?

Avvalo shuni ta'kidlashni istardimki, EntityManager JPA ning asosiy komponentlaridan biri bo'lib , u sub'ektlarning ma'lumotlar bazasi bilan o'zaro aloqasi uchun ishlatiladi. Umuman olganda, u ob'ekt va ma'lumotlar bazasi o'rtasidagi o'zaro ta'sir qilish usullarini chaqiradi (davom etish, birlashtirish, olib tashlash, ajratish) ... Lekin shuni ham ta'kidlaymanki, bu komponent, qoida tariqasida, butun dastur uchun bitta emas: ko'pincha u engil va tez-tez olib tashlanadi va yangisi EntityManagerFactory yordamida yaratiladi . Agar biz JDBC bilan parallel chizsak , bu erda EntityManagerFactory DataSource analogi bo'ladi , keyin EntityManager, o'z navbatida, Connection analogi bo'ladi . Avvalroq men joriy ulanish tomonidan boshqariladigan ob'ekt sifatida doimiylik ob'ektini eslatib o'tdim. Shunday qilib: bu ob'ekt joriy ulanish bilan chambarchas bog'liq bo'lgan EntityManager va tranzaktsiyalarni ochish/yopish uchun mas'ul bo'lgan TransactionManager tomonidan boshqariladi . Quyidagi rasmda siz ob'ektning hayot aylanishini ko'rishingiz mumkin: Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 6 - 5EntityManager ob'ektni boshqariladigan bosqichda boshqaradi (hozirda u doimiy, chunki u EntityManager bilan bog'langan). Ya'ni, u endi yangi emas va hali o'chirilmagan. Aytishimiz mumkinki, ob'ekt yangi yoki olib tashlanganda, u ham ajratiladi, chunki u EntityManager tomonidan boshqarilmaydi. EntityManager uchun turli strategiyalar mavjud. Ya'ni, butun ilova uchun bitta yagona EntityManager bo'lishi mumkin yoki har bir ulanish uchun har safar yangisini yaratish mumkin. Agar siz Spring dan foydalansangiz, EntityManager-ni yaratish/o'chirish avtomatik ravishda qopqoq ostida boshqariladi (lekin bu siz uni moslashtira olmaysiz degani emas ^^). Aytish joizki, bir yoki bir nechta EntityManagers doimiylik kontekstini tashkil qiladi . Doimiylik konteksti - ob'ektlar nusxalari ma'lumotlar bazasidagi o'xshash ob'ektlar bilan sinxronlashtiriladigan muhit (men aytganimdek, bu faqat doimiy ob'ektlar uchun ishlaydi). Agar siz JPA ni chuqurroq o'rgansangiz (buni men juda tavsiya qilaman), siz ushbu tushunchalarga juda tez-tez duch kelasiz.

56. Assert sinfi nima? Nima uchun undan foydalanish kerak?

Men JPA da bunday sinf haqida eshitmaganman, shuning uchun bu kodni birlik sinovi uchun ishlatiladigan kutubxonaning JUnit sinfiga tegishli deb o'ylayman . Ushbu kutubxonaning Assert klassi kodning bajarilishi natijalarini tekshirish uchun ishlatiladi ( assert ma'lum bir joyda ma'lum bir holat/ma'lumotlarga ega ekanligingiz haqidagi bayonotdir). Misol uchun, siz mushukni yaratishi kerak bo'lgan usulni sinab ko'ryapsiz. Siz usulni ishga tushirasiz va natijaga erishasiz:
Cat resultOfTest = createCat();
Lekin siz uning to'g'ri yaratilganligiga ishonch hosil qilishingiz kerak, to'g'rimi? Shunday qilib, siz avvalroq mushukdan kutilgan parametrlarga ega bo'lgan holda qo'lda yaratgan edingiz . Keyin natijalarni tekshirish uchun Assert sinfidan foydalanasiz :
Assert.assertEquals(resultOfTest, expectedCat);
Agar mushuklar boshqacha bo'lsa, AssertionError istisnosi tashlanadi , bu bizga kutilgan natijalar bir-biriga yaqinlashmasligini bildiradi. Assert sinfida kutilgan natijalarni tekshirish bo'yicha ko'plab vazifalarni qamrab oluvchi juda ko'p turli usullar mavjud. Mana ulardan ba'zilari:
  • assertTrue(<boolean>) - argument sifatida qabul qilingan kutilgan qiymat rost bo'lishi kerak

  • assertFalse(<boolean>) - argument sifatida qabul qilingan kutilgan qiymat noto'g'ri bo'lishi kerak

  • assertNotEquals(<object1>, <object2>) - argument sifatida qabul qilingan ob'ektlar teng ( yolg'on ) yordamida solishtirilganda boshqacha bo'lishi kerak.

  • assertThrows(<ClassNameOfException>.class, <exceptionObject>) - ikkinchi argument birinchi argument tomonidan ko'rsatilgan sinfning istisnosi bo'lishi kutilmoqda (ya'ni, qoida tariqasida, ikkinchi argument o'rniga, shunday bo'lishi kerak bo'lgan usul chaqiriladi) talab qilinadigan turdagi istisnoni tashlang)

String

57. Java tilidagi Stringni xarakterlang

String Java-dagi standart sinf bo'lib, satr qiymatlarini (belgilar ketma-ketligini) saqlash va boshqarish uchun javobgardir, o'zgarmas sinf (men o'zgarmas haqida avvalroq yozganman ), ya'ni. Ushbu sinf ob'ektlarining ma'lumotlarini yaratilgandan keyin o'zgartirib bo'lmaydi. Darhol shuni ta'kidlashni istardimki, StringBuilder va StringBuffer sinflari deyarli bir xil ikkita sinf bo'lib, ularning yagona farqi shundaki, ulardan biri ko'p tarmoqli muhitda (StringBuffer) foydalanish uchun mo'ljallangan. Ushbu sinflar String ga o'xshaydi , lekin undan farqli o'laroq, ular o'zgaruvchan . Ya'ni, ob'ektlar yaratilgandan so'ng, yangi ob'ekt yaratmasdan, ular ifodalovchi qatorni o'zgartirishga imkon beradi. Aslida, usullar standart String usullaridan farq qiladi va satrni o'zgartirish ehtiyojlarini qondirishga qaratilgan (ularni quruvchi deb atashgani bejiz emas). Ushbu maqolada String , StringBuffer va StringBuilder haqida ko'proq o'qing .

58. String obyektini yaratishning qanday usullari mavjud? Qayerda yaratilgan?

Satr yaratishning eng keng tarqalgan usuli bu ikki qavs ichida kerakli qiymatni ko'rsatishdir:
String str = "Hello World!";
Buni bevosita new orqali ham qilishingiz mumkin :
String str = new String("Hello World!");
Belgilar qatoridan boshlab qator yaratishingiz mumkin:
char[] charArr = {'H','e','l','l','o',' ', 'W','o','r','l','d','!'};
String str = new String(charArr);
Ba'zi ob'ektda ishlaydigan toString usuli natijasida :
String str = someObject.toString();
Boshqa har qanday usulning natijasi singari, u satr tasvirini qaytaradi. Masalan:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str =  reader.readLine();
Siz tushunganingizdek, satr yaratishning juda ko'p usullari bo'lishi mumkin. String ob'ekti yaratilganda , u string hovuzida saqlanadi , biz quyida keltirilgan savollardan birida batafsilroq gaplashamiz.

59. Java-da ikkita satr qanday taqqoslanadi va ularni qanday tartiblash mumkin?

Java qiymatlarni solishtirish uchun == juft tenglik belgisidan foydalanadi . Agar bizga int kabi oddiy qiymatlarni solishtirish kerak bo'lsa , biz undan foydalanardik. Ammo bu usul to'liq ob'ektlarni solishtirish uchun qo'llanilmaydi. Bunday holda, bu faqat havolalarni taqqoslash bo'ladi - ular bir xil ob'ektga ishora qiladimi yoki yo'qmi. Ya'ni, ikkita ob'ektni ichki maydonlarning mutlaqo bir xil qiymatlari bilan taqqoslaganda, == orqali taqqoslash noto'g'ri natija beradi : ob'ektlarning bir xil maydonlariga qaramay, ob'ektlarning o'zlari turli xil xotira katakchalarini egallaydi. String sinfining ob'ektlari , ularning aldamchi soddaligiga qaramay, hali ham ob'ektlardir. Va == orqali taqqoslash ular uchun ham qo'llanilmaydi (hatto torli hovuz mavjudligiga qaramay). Bu erda Ob'ekt sinfining standart usuli o'ynaydi - equals , uning to'g'ri ishlashi uchun sinfda bekor qilinishi kerak (aks holda, u sukut bo'yicha == yordamida solishtiriladi ). Bu String sinfida bekor qilingan , shuning uchun biz uni qabul qilamiz va undan foydalanamiz:
String firstStr = "Hello World!";
String secondStr = "Hello World!";
boolean isEquals = firstStr.equals(secondStr);
Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 6 - 6Biz mos taqqoslashlar haqida gaplashdik, endi taqqoslashlarni tartiblashni ko'rib chiqaylik. Axir, biror narsani saralash uchun biz qanday printsip bo'yicha saralashni bilishimiz kerak. Buning uchun siz standart tartiblangan to'plamdan foydalanishingiz mumkin - TreeSet . Java-dagi turli to'plamlar haqida ko'proq ma'lumotni ushbu maqolada o'qishingiz mumkin . Ushbu ro'yxat qizil-qora daraxt algoritmi asosida ishlaydi va to'plamni belgilangan saralash printsipiga muvofiq tartiblaydi. Yuqorida aytganimdek, ma'lum turdagi ob'ektlarni qanday saralashni tushunishingiz kerak. Taqqoslovchilar tartiblash uchun solishtirish usulini o'rnatish uchun ishlatiladi . Odatda ular tartiblashni xohlagan sinflar uchun amalga oshirilishi kerak, lekin String holatida ular allaqachon amalga oshirilgan. Shuning uchun biz TreeSet ga kerakli qatorlarni qo'shamiz va u ularni saralaydi:
TreeSet<String> sortedSet = new TreeSet<>();
sortedSet.add("B");
sortedSet.add("C");
sortedSet.add("A");
sortedSet.forEach(System.out::println);
Konsol chiqishi:
A B C

60. Satrni belgiga aylantirish algoritmini keltiring. Tegishli kodni yozing

Yuqorida aytib o'tganimdek, String sinfining ob'ektlari juda ko'p turli xil foydali usullarga ega. Ulardan biri toCharArray . Ushbu usul qatorni belgilar qatoriga o'zgartiradi:
String str = "Hello world";
char[] charArr = str.toCharArray();
Keyin bizda indeks bo'yicha chaqirishimiz mumkin bo'lgan belgilar majmuasi mavjud:
char firstChar = charArr[0]; // H

61. Satrni bayt massiviga va orqaga qanday aylantiriladi? Tegishli kodni yozing

toCharArray usuliga o'xshab , String sinfida satrning bayt massivini qaytaruvchi getBytes usuli mavjud :
String str = "Hello world";
byte[] byteArr = str.getBytes();
byte firstChar = byteArr[6]; // 119
Tahlilning bugungi qismi mantiqiy yakuniga yetdi. E'tiboringiz uchun rahmat!Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 6 - 7
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION