JavaRush /Java блогы /Random-KK /Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жа...
Константин
Деңгей

Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау. 6-бөлім

Топта жарияланған
Сәлем Әлем! Дамуды жалғастыру кез келген әзірлеуші ​​үшін өте маңызды. Ақыр соңында, егер сіз тоқтасаңыз, талап етілмейтін және нарықтан толығымен ұшып кету қаупі бар: IT әлемі үнемі дамып, алға жылжуда және сіз онымен бірге қозғалуыңыз керек. Бірақ сонымен бірге, классиканы (классикалық тақырыптар) ұмытпау үшін жаңа және жаңа технологияларға ғана назар аударуға болмайды. Бүгін мен Java әзірлеушісіне арналған «классикалық» тақырыптар бойынша сұрақтарды талдауды жалғастырғым келеді. Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  6 - 1 бөлімМенің жауаптарым түпкілікті өкілеттік емес екенін ескертемін - мен бұл сұрақтардың дұрыс жауаптарын осылай көремін, және сіз олардың кейбірімен келіспеуіңіз мүмкін. Бұл қалыпты жағдай болады, сондықтан түсініктемелерде өз пікіріңізбен бөлісіңіз. Талдау бөліктеріне сілтемелер мақаланың соңында.Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  6 - 2 бөлім

Кітапханалар және стандарттар

52. Күту күйі дегеніміз не? JPA мен Hibernate арасындағы айырмашылық неде?

Менің ойымша, бұл сұраққа жауап беру үшін алдымен JPA деген не екенін түсіну керек . JPA қарапайым Java нысандарының an objectілік қатынасты салыстыруын сипаттайтын және мұндай нысандарды сақтауға, шығарып алуға және өңдеуге арналған API қамтамасыз ететін спецификация болып табылады. Яғни, есімізде қалғандай, реляциялық мәліметтер қоры (МҚ) өзара байланысты көптеген кестелер түрінде берілген. Ал JPA - бұл an objectілердің реляциялық дерекқорлармен қалай әрекеттесе алатынын сипаттайтын кеңінен қабылданған стандарт. Көріп отырғаныңыздай, JPA дерексіз және материалдық емес нәрсе. Бұл идеяның өзі, көзқарас сияқты. Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  6 - 3 бөлімСонымен қатар, Hibernate - бұл JPA парадигмаларын жүзеге асыратын арнайы кітапхана . Яғни, осы кітапхананың көмегімен дерекқордан (Entity) мәліметтерді көрсететін an objectілер арқылы реляциялық мәліметтер қорымен жұмыс істеуге болады. Олар айтқандай, бұл кітапхана JPA идеалдарына өте жақын және сондықтан да танымал болды. Және сіз түсінгеніңіздей, пайдаланудың танымалдығы одан әрі дамыту мен жақсарту үшін жақсы дәлел болып табылады. Сонымен қатар, оны жиі қолданудың артында осы құралға қатысты барлық мүмкін және мүмкін емес сұрақтарды сұрыптап қойған үлкен қауымдастық бар. Міне, осы технологияның барлық қараңғы бұрыштарын егжей-тегжейлі қарастыратын кітаптың мысалы . Яғни, Hibernate мүмкіндігінше зерттелді және сенімді болып шықты. Шындығында, көктемгі жағындағы JPA-ны тамаша іске асыру әдетте капюшонның астында күту режимін қолданады деген бекер емес.

53. Каскадтық дегеніміз не? Күту күйінде ол қалай қолданылады?

Жоғарыда айтқанымдай, күту күйінде байланыс entities деп аталатын деректер an objectілері арқылы жүзеге асырылады . Бұл нысандар дерекқордағы кейбір нақты кестелерді көрсетеді және есіңізде болса, Java сыныптарында басқа сыныптарға сілтемелер болуы мүмкін. Бұл байланыстар деректер қорында көрсетіледі. Дерекқорда, әдетте, бұл сыртқы кілттер (OneToOne, OneToMany, ManyToOne үшін) немесе аралық кестелер (ManyToMany үшін).Осы мақалада нысандар арасындағы қарым-қатынас туралы қосымша ақпаратты оқуға болады . Нысаныңызда басқа қатысты нысандарға сілтемелер болса, қосылым түрін көрсету үшін осы сілтемелердің үстіне annotationлар орналастырылады: @OneToOne, @OneToMany, @ManyToOne, @ManyToMane, олардың параметрлерінде сипаттың мәнін көрсетуге болады - каскад - осы қосылымға арналған каскад түрі. JPA-да нысандармен өзара әрекеттесу үшін арнайы әдістер бар (тұрақты, сақтау, біріктіру...) . Каскадты түрлер осы әдістер мақсатты нысанда пайдаланылған кезде байланысты деректердің қалай әрекет ететінін көрсету үшін дәл пайдаланылады. Сонымен, каскадтық стратегиялар (каскадтың түрлері) қандай? JPA стандарты каскадтың алты түрін қолдануды білдіреді:
  • PERSIST - сақтау операциялары каскадта орындалады ( save() және persist() әдістері үшін ). Яғни, егер біз басқа нысандармен байланысты нысанды сақтасақ, олар да дерекқорда сақталады (егер олар әлі жоқ болса)

  • MERGE - жаңарту операциялары каскадта орындалады ( біріктіру() әдісі үшін )

  • REMOVE - жою операциялары каскадта орындалады ( remove() әдісі )

  • БАРЛЫҒЫ - бірден үш каскадты операцияны қамтиды - PERSIST - MERGE - REMOVE

JPA тұрақты нысан тұжырымдамасына ие - дерекқордағы оның деректерімен байланысты нысан, оны ағымдағы сеанс (байланыс) басқарады . Егер сіз оны өзгертсеңіз, бірақ өзгерістерді дерекқорда сақтамасаңыз, оның дерекқордағы деректері бәрібір өзгереді.
  • DETACH байланысты нысандар сеанс арқылы басқарылмайды ( detach() әдісі ). Яғни, олар өзгерген кезде дерекқордағы деректерінде автоматты түрде өзгеріс болмайды - олар тұрақты күйден оқшауланған күйге ауыстырылады (JPA басқармайтын нысан)

  • ЖАҢАРТУ - нысан дерекқордағы деректермен жаңартылған сайын ( refresh() - бөлінген нысандарды жаңартады), қатысты нысандар бірдей жаңартылады. Мысалы, сіз қандай да бір түрде дерекқордан алынған деректерді өзгерттіңіз және оның бастапқы мәндерін қайтарғыңыз келеді. Бұл жағдайда бұл операция сізге пайдалы болады.

Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  6 - 4 бөлімКүту күйі осы стандартты каскадты операциялардың барлығын қолдайды, сонымен қатар оның үшеуін ұсынады:
  • РЕПЛИКАТАУ – бізде бірнеше деректер көзі болған кезде пайдаланылады және біз деректердің синхрондалғанын қалаймыз (күту әдісі – репликация). Барлық нысандардың идентификаторлары (идентификаторы) болуы керек, осылайша олардың генерациясында проблемалар туындамайды (бір нысанның әртүрлі дерекқорлар үшін әртүрлі идентификаторлары болмауы үшін)

  • SAVE_UPDATE - каскадты сақтау/жою (күту әдісі үшін - saveOrUpdate )

  • LOCK - DETACHED күйіне кері операция : ол бөлінген нысанды тұрақтылық күйіне қайтарады , яғни. нысан ағымдағы сеанс арқылы қайтадан бақыланады

Егер каскадты түрі таңдалмаса, нысандағы ешбір операция онымен байланысты басқа нысандарға әсер етпейді.

54. Entity класы абстрактілі бола ала ма?

2.1 Нысан сыныбының JPA спецификациясында « Дерексіз және нақты сыныптар да нысандар бола алады » деген жол бар . Сонымен, жауап иә, абстрактілі сынып нысан болуы мүмкін және @Entity арқылы түсіндірілуі мүмкін.

55. Кәсіпорын менеджері дегеніміз не? Ол не үшін жауапты?

Ең алдымен, EntityManager JPA негізгі құрамдастарының бірі екенін атап өткім келеді , ол субъектілердің дерекқормен өзара әрекеттесуі үшін қолданылады. Тұтастай алғанда, ол нысан мен дерекқор арасындағы өзара әрекеттесу әдістерін атайды (сақтау, біріктіру, жою, ажырату)... Бірақ мен бұл компонент, әдетте, бүкіл қолданба үшін бір емес екенін де атап өткім келеді: көбінесе ол жеңіл және жиі жойылады және жаңасы EntityManagerFactory көмегімен жасалады . Егер EntityManagerFactory DataSource аналогы болатын JDBC параллельді жүргізсек , онда EntityManager өз кезегінде Connection аналогы болады . Бұрын мен ағымдағы қосылым арқылы басқарылатын нысан ретінде тұрақтылық нысанын айттым. Сонымен: бұл нысанды дәл ағымдағы қосылыммен тығыз байланысты EntityManager және транзакцияларды ашу/жабу үшін жауап беретін TransactionManager басқарады . Одан әрі төмендегі суретте нысанның өмірлік циклін көруге болады: EntityManager нысанды Басқарылатын кезеңде басқарады (қазір ол тұрақты, себебі оның EntityManager бағдарламасымен байланысы бар). Яғни, ол енді жаңа емес және әлі жойылған жоқ. Нысан жаңа немесе жойылған кезде ол да ажыратылады деп айта аламыз, өйткені оны EntityManager басқармайды. EntityManager үшін әртүрлі стратегиялар бар. Яғни, бүкіл қолданба үшін бір синглтон EntityManager болуы мүмкін немесе әр қосылым үшін жаңасын әр уақытта жасауға болады. Көктемді пайдалансаңыз, EntityManager жасау/жою автоматты түрде қақпақ астында басқарылады (бірақ бұл оны теңшеу мүмкін емес дегенді білдірмейді ^^). Бір немесе бірнеше EntityManagers тұрақтылық контекстін құрайтынын айта кеткен жөн . Тұрақтылық мәтінмәні — нысандардың даналары дерекқордағы ұқсас нысандармен синхрондалатын орта (бұл тек тұрақты нысандар үшін жұмыс істейді, айтқанымдай). Егер сіз JPA -ға тереңірек үңілсеңіз (мен оны өте ұсынамын), сіз бұл ұғымдарды өте жиі кездестіресіз.Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 6 - 5

56. Assert класы дегеніміз не? Неліктен оны пайдалану керек?

Мен JPA -де мұндай класс туралы естіген жоқпын, сондықтан бұл codeты бірлік тестілеу үшін пайдаланылатын кітапхананың JUnit сыныбына қатысты деп есептеймін . Бұл кітапхананың Assert сыныбы codeтың орындалу нәтижелерін тексеру үшін пайдаланылады ( assert - белгілі бір жерде белгілі күй/деректер бар екендігі туралы мәлімдеме). Мысалы, сіз мысық жасау керек әдісті сынап жатырсыз. Сіз әдісті іске қосып, кейбір нәтиже аласыз:
Cat resultOfTest = createCat();
Бірақ оның дұрыс жасалғанына көз жеткізу керек, солай ма? Сондықтан, сіз бұрын createCat() әдісінен алынған мысықтан күткен параметрлермен белгілі бір мысық - expectCat -ті қолмен жасадыңыз . Содан кейін нәтижелерді тексеру үшін Assert сыныбын пайдаланасыз :
Assert.assertEquals(resultOfTest, expectedCat);
Егер мысықтар басқаша болса, күтілетін нәтижелер біріктірілмейтінін көрсететін AssertionError ерекшелігі шығарылады. Assert сыныбында күтілетін нәтижелерді тексерудің көптеген тапсырмаларын қамтитын көптеген әртүрлі әдістер бар. Мұнда олардың кейбіреулері бар:
  • assertTrue(<boolean>) - аргумент ретінде алынған күтілетін мән ақиқат болуы керек

  • assertFalse(<boolean>) - аргумент ретінде алынған күтілетін мән жалған болуы керек

  • assertNotEquals(<object1>, <object2>) - аргумент ретінде алынған нысандар тең ( false ) арқылы салыстырылғанда әр түрлі болуы керек

  • assertThrows(<ClassNameOfException>.class, <exceptionObject>) - екінші аргумент бірінші аргументпен көрсетілген сыныптан ерекшелік болады деп күтілуде (яғни, әдетте, екінші аргументтің орнына, әдіс шақырылады, ол қажетті түрдегі ерекшелікті тастаңыз)

Жол

57. Java тіліндегі жолды сипаттаңыз

String - Java тіліндегі стандартты класс, жол мәндерін (таңбалар тізбегі) сақтауға және өңдеуге жауап береді, өзгермейтін класс (мен өзгермейтін туралы бұрын жазғанмын ), яғни. Бұл класс an objectілерінің деректерін жасалғаннан кейін өзгерту мүмкін емес. StringBuilder және StringBuffer кластары іс жүзінде бірдей екі сынып екенін бірден атап өткім келеді, олардың бір ғана айырмашылығы - олардың біреуі көп ағынды ортада (StringBuffer) пайдалануға арналған. Бұл сыныптар String түріне ұқсас , бірақ одан айырмашылығы олар өзгермелі . Яғни, бір рет жасалған нысандар жаңа нысанды жасамай-ақ өздері көрсететін жолды өзгертуге мүмкіндік береді. Шындығында, әдістер стандартты String әдістерінен ерекшеленеді және жолды өзгерту қажеттіліктерін қанағаттандыруға бағытталған (оларды құрылысшы деп бекер айтпаған). String , StringBuffer және StringBuilder туралы толығырақ осы мақалада оқыңыз .

58. String an objectісін құрудың әртүрлі тәсілдері қандай? Ол қай жерде құрылған?

Жолды жасаудың ең көп тараған жолы - қос жақшаға қажетті мәнді жай ғана көрсету:
String str = "Hello World!";
Мұны тікелей new арқылы да жасауға болады :
String str = new String("Hello World!");
Сіз таңбалар массивінен бастап жолды жасай аласыз:
char[] charArr = {'H','e','l','l','o',' ', 'W','o','r','l','d','!'};
String str = new String(charArr);
Кейбір нысанда жұмыс істейтін toString әдісінің нәтижесінде :
String str = someObject.toString();
Кез келген басқа әдістің нәтижесі сияқты ол жол көрінісін қайтарады. Мысалы:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str =  reader.readLine();
Өздеріңіз түсінгендей, жолды жасаудың өте, өте көп тәсілдері болуы мүмкін. String нысаны жасалғанда , ол жол пулында сақталады , ол туралы төмендегі сұрақтардың бірінде толығырақ айтатын боламыз.

59. Java тілінде екі жолды қалай салыстыруға болады және оларды қалай сұрыптауға болады?

Java тіліндегі мәндерді салыстыру үшін қос теңдік белгісі == пайдаланылады . Егер бізге int сияқты қарапайым мәндерді салыстыру қажет болса , біз оны қолданар едік. Бірақ бұл әдіс толыққанды an objectілерді салыстыру үшін қолданылмайды. Бұл жағдайда бұл тек сілтемелерді салыстыру болады - олар бір нысанды меңзейді ме, жоқ па. Яғни, ішкі өрістердің мәндері бірдей екі нысанды салыстыру кезінде == арқылы салыстыру жалған нәтиже береді : an objectілердің бірдей өрістеріне қарамастан, an objectілердің өзі әртүрлі жад ұяшықтарын алады. String класының an objectілері алдамшы қарапайымдылығына қарамастан, әлі де нысандар болып табылады. Және == арқылы салыстыру олар үшін де қолданылмайды (тіпті жол пулының болуына қарамастан). Мұнда Object класының стандартты әдісі іске қосылады - equals , ол дұрыс жұмыс істеуі үшін сыныпта қайта белгіленуі керек (әйтпесе әдепкі бойынша ол == арқылы салыстырады ). Ол String сыныбында қайта анықталған , сондықтан біз оны алып, оны қолданамыз:
String firstStr = "Hello World!";
String secondStr = "Hello World!";
boolean isEquals = firstStr.equals(secondStr);
Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 6 - 6Сәйкестік салыстыру туралы айттық, енді салыстыруларды сұрыптауды қарастырайық. Өйткені, бір нәрсені сұрыптау үшін қандай принцип бойынша сұрыптау керектігін білуіміз керек. Мұны істеу үшін стандартты сұрыпталған жиынды пайдалануға болады - TreeSet . Java тіліндегі әртүрлі жинақтар туралы толығырақ осы мақаладан оқи аласыз . Бұл тізім қызыл-қара ағаш алгоритмі негізінде жұмыс істейді және жиынды көрсетілген сұрыптау принципіне сәйкес сұрыптайды. Жоғарыда айтқанымдай, белгілі бір типтегі an objectілерді қалай сұрыптау керектігін түсіну керек. Сұрыптау үшін салыстыру әдісін орнату үшін компараторлар қолданылады . Әдетте бұл сұрыптағыңыз келетін сыныптар үшін орындалуы керек, бірақ String жағдайында олар қазірдің өзінде орындалған. Сондықтан біз TreeSet ішіне қажетті жолдарды қосамыз және ол оларды сұрыптайды:
TreeSet<String> sortedSet = new TreeSet<>();
sortedSet.add("B");
sortedSet.add("C");
sortedSet.add("A");
sortedSet.forEach(System.out::println);
Консоль шығысы:
A B C

60. Жолды символға түрлендіру алгоритмін көрсетіңіз. Сәйкес codeты жазыңыз

Жоғарыда айтқанымдай, String класының нысандарында көптеген пайдалы әдістер бар. Олардың бірі toCharArray . Бұл әдіс жолды таңбалар массивіне түрлендіреді:
String str = "Hello world";
char[] charArr = str.toCharArray();
Әрі қарай бізде индекс бойынша шақыруға болатын таңбалар массиві бар:
char firstChar = charArr[0]; // H

61. Жолды byte массивіне және кері түрлендіру қалай орындалады? Сәйкес codeты жазыңыз

toCharArray әдісіне ұқсас , String сыныбында жолдың byte массивін қайтаратын getBytes әдісі бар :
String str = "Hello world";
byte[] byteArr = str.getBytes();
byte firstChar = byteArr[6]; // 119
Талдаудың бүгінгі бөлігі логикалық тұрғыдан аяқталды. Назарларыңызға рахмет!Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 6 - 7
Сериядағы басқа материалдар:
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION