JavaRush /Java блогу /Random-KY /Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун...
Константин
Деңгээл

Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи. 6-бөлүк

Группада жарыяланган
Салам дүйнө! Иштеп чыгууну улантуу ар бир иштеп чыгуучу үчүн абдан маанилүү. Анткени, эгер сиз токтоп калсаңыз, талап кылынбай калуу жана рыноктон толугу менен учуп кетүү коркунучу бар: IT дүйнөсү тынымсыз өнүгүп, алдыга жылып жатат, жана сиз аны менен бирге жүрүшүңүз керек. Бирок ошол эле учурда да, классикалык (классикалык темалар) жөнүндө, мындайча айтканда, унутуп калбоо үчүн, жаңы жана жаңы технологияларга көңүл бурууга болбойт. Бүгүн мен Java иштеп чыгуучусу үчүн "классикалык" темалардагы суроолорду талдоону уланткым келет. Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  6-1-бөлүкМенин жоопторум акыркы ыйгарым укук эмес экенин белгилеймин - бул суроолорго туура жоопторду мен көрүп турам жана сиз алардын айрымдары менен макул болбошуңуз мүмкүн. Бул нормалдуу болот, андыктан комментарийлерде өз оюңуз менен бөлүшүүдөн тартынбаңыз. Анализдин бөлүктөрүнө шилтемелер макаланын аягында.Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  6-2-бөлүк

Китепканалар жана стандарттар

52. Күтүү деген эмне? JPA менен Hibernate ортосунда кандай айырма бар?

Бул суроого жооп берүү үчүн, биз алгач JPA деген эмне экенин түшүнүшүбүз керек деп ойлойм . JPA жөнөкөй Java an objectилеринин an objectиге-катышкан картасын сүрөттөгөн спецификация жана мындай an objectтерди сактоо, алуу жана башкаруу үчүн API камсыз кылат. Башкача айтканда, биздин эсибизде тургандай, реляциялык маалымат базалары (МБ) көптөгөн өз ара байланышкан tableлар түрүндө берилген. Ал эми JPA an objectтердин реляциялык маалымат базалары менен кантип иштеше аларын сүрөттөгөн кеңири кабыл алынган стандарт. Көрүнүп тургандай, JPA абстракттуу жана материалдык эмес нерсе. Бул идеянын өзү, мамиле сыяктуу. Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  6-3-бөлүкОшол эле учурда, Hibernate бул JPA парадигмаларын ишке ашырган белгилүү бир китепкана . Башкача айтканда, бул китепкананын жардамы менен маалыматтар базасынан (Entity) маалыматтарды чагылдырган an objectтер аркылуу реляциялык маалымат базасы менен иштөөгө болот. Алар айткандай, бул китепкана JPA идеалдарына абдан жакын жана балким, ошондуктан ал популярдуу болуп калды. Жана сиз түшүнгөндөй, колдонуунун популярдуулугу андан ары өнүктүрүү жана жакшыртуу үчүн жакшы аргумент болуп саналат. Мындан тышкары, аны тез-тез колдонуу артында бул куралга байланыштуу бардык мүмкүн болгон жана мүмкүн эмес суроолорду иргеп алган чоң коомчулук бар. Бул жерде бул технологиянын бардык караңгы бурчтарын майда-чүйдөсүнө чейин изилдеген китептин бир мисалы . Башкача айтканда, Hibernate мүмкүн болушунча изилденген жана, ал ишенимдүү болуп чыкты. Чындыгында, жаз тарапта JPAнын идеалдуу ишке ашырылышы да, адатта, капоттун астында Гибернатты колдоноору бекеринен эмес.

53. Каскад деген эмне? Күтүү режиминде ал кантип колдонулат?

Мен жогоруда айткандай, Hibernate режиминде байланыш an objectтер деп аталган маалымат an objectтери аркылуу ишке ашырылат . Бул an objectтер маалымат базасындагы кээ бир белгилүү tableларды билдирет жана эсиңизде болсо, Java класстарында башка класстарга шилтемелер болушу мүмкүн. Бул мамилелер маалымат базасында чагылдырылат. Берorштер базасында, эреже катары, бул чет өлкөлүк ачкычтар (OneToOne, OneToMany, ManyToOne үчүн) же аралык tableлар (ManyToMany үчүн).Сиз бул макаладан an objectилердин ортосундагы байланыш тууралуу кененирээк окуй аласыз . Сиздин мекемеңизде башка тиешелүү an objectтерге шилтемелер болгондо, байланыштын түрүн көрсөтүү үчүн бул шилтемелердин үстүнө annotationлар жайгаштырылат: @OneToOne, @OneToMany, @ManyToOne, @ManyToMane, алардын параметрлеринде мүлктүн маанисин - каскадды - көрсөтүүгө болот. бул байланыш үчүн каскад түрү. JPA an objectилер менен өз ара аракеттенүүнүн атайын ыкмаларына ээ (туруктуу, сактоо, бириктирүү...) . Каскаддык типтер, бул ыкмалар максаттуу an objectте колдонулганда байланышкан маалыматтар кандай иш алып барышы керектигин көрсөтүү үчүн так колдонулат. Ошентип, каскаддык стратегиялар (каскаддын түрлөрү) кандай? JPA стандарты каскаддын алты түрүн колдонууну билдирет:
  • PERSIST - сактоо операциялары каскадда ишке ашат ( save() жана persist() методдору үчүн ). Башкача айтканда, биз башка an objectилер менен байланышкан an objectти сактасак, алар да маалымат базасында сакталат (эгерде алар мурунтан эле жок болсо)

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

  • REMOVE - алып салуу операциялары каскадда ишке ашат ( remove() методу )

  • ALL - бир эле учурда үч каскаддык операцияны камтыйт - PERSIST - BIRISH - REMOVE

JPA туруктуу субъект деген түшүнүккө ээ - анын маалыматтар базасындагы маалыматтары менен байланышкан an object, ал учурдагы сессия (байланыш) тарабынан башкарылат . Эгер сиз аны өзгөртсөңүз, бирок маалыматтар базасындагы өзгөртүүлөрдү сактабасаңыз, анын маалымат базасындагы маалыматтары баары бир өзгөрөт.
  • DETACH менен байланышкан an objectтер сеанс менен башкарылbyte ( detach() ыкмасы ). Башкача айтканда, алар өзгөргөндө, маалымат базасында алардын маалыматтарында автоматтык түрдө өзгөрүү болбойт - алар туруктуу абалдан ажыратылганга (JPA тарабынан башкарылбаган an object) өткөрүлөт.

  • REFRESH - an object маалымат базасынан маалыматтар менен жаңыланган сайын ( refresh() - ажыратылган an objectтерди жаңылайт), тиешелүү an objectтер да ушундай эле жаңыртылып турат. Мисалы, сиз кандайдыр бир жол менен маалымат базасынан алынган маалыматтарды өзгөртүп, анын баштапкы маанилерин кайтарып келет. Бул учурда, бул операция сизге пайдалуу болот.

Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  6-4-бөлүкHibernate бул стандарттуу каскаддык операциялардын баарын колдойт, бирок өзүнүн үчөөнү да киргизет:
  • КАЙРЫЛУУ - Бизде бирден ашык маалымат булагы болгондо жана биз берorштер синхрондоштурууну каалаганда колдонулат (Күйүү ыкмасы - репликация). Бардык an objectтердин идентификаторлору (id) болушу керек, андыктан алардын жаралышында эч кандай көйгөйлөр болбойт (бир эле an objectте ар кандай маалымат базалары үчүн ар кандай идентификаторлор болбошу үчүн)

  • SAVE_UPDATE - каскаддык сактоо/жок кылуу (Каттоо ыкмасы үчүн - saveOrUpdate )

  • LOCK – АЖЫРАГАНга тескери операция : ал ажыратылган an objectти кайра туруктуулук абалына өткөрөт , б.а. an object кайра учурдагы сессия тарабынан көзөмөлдөнөт

Эгерде каскаддык түрү тандалбаса, an objectке жасалган эч кандай операция аны менен байланышкан башка an objectтерге эч кандай таасир тийгизбейт.

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

JPA спецификациясында 2.1 Объект классынын саптары бар: " Абстракттуу жана конкреттүү класстар дагы an objectилер болушу мүмкүн ." Демек, жооп ооба, абстракттуу класс субъект болушу мүмкүн жана @Entity менен annotationланышы мүмкүн.

55. Субъекттин менеджери деген эмне? Ал эмне үчүн жооптуу?

Биринчиден, EntityManager JPAнын негизги компоненттеринин бири экендигин белгилеп кетким келет , ал субъекттердин маалымат базасы менен өз ара аракеттенүүсү үчүн колдонулат. Жалпысынан алганда, ал an object менен маалымат базасынын ортосундагы өз ара аракеттенүү ыкмаларын атайт (талап кылуу, бириктирүү, алып салуу, ажыратуу)... Бирок мен дагы белгилейт элем, бул компонент, эреже катары, бүтүндөй тиркеме үчүн бир эмес: көбүнчө ал жеңил жана көп учурда алынып салынат жана EntityManagerFactory аркылуу жаңысы түзүлөт . Эгерде биз JDBC менен параллель түзсөк , анда EntityManagerFactory DataSource аналогу болот , анда EntityManager өз кезегинде Connection аналогу болот . Мурда мен учурдагы байланыш тарабынан башкарылуучу an object катары туруктуулук an objectи жөнүндө айттым. Ошентип: бул an object так учурдагы туташуу менен тыгыз байланышкан EntityManager жана транзакцияларды ачуу/жабуу үчүн жооптуу болгон TransactionManager тарабынан башкарылат . Андан ары төмөндөгү сүрөттө сиз an objectтин жашоо циклин көрө аласыз: Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 6 - 5EntityManager an objectти Башкарылуучу баскычта болгондо башкарат (учурда ал туруктуу, анткени анын EntityManager менен байланышы бар). Башкача айтканда, ал жаңы эмес жана али жоюла элек. Биз субъект жаңы же жок болгондо, ал да ажыратылган деп айта алабыз, анткени ал EntityManager тарабынан башкарылbyte. EntityManager үчүн ар кандай стратегиялар бар. Башкача айтканда, бүт тиркеме үчүн бир синглтон EntityManager болушу мүмкүн, же ар бир туташуу үчүн жаңысы түзүлүшү мүмкүн. Эгер сиз Жазды колдонсоңуз, анда EntityManager түзүлүшү/жок кылынышы капоттун астында автоматтык түрдө башкарылат (бирок бул сиз аны ыңгайлаштыра албайсыз дегенди билдирбейт ^^). Бир же бир нече EntityManagers туруктуу контекстти түзөрүн айта кетүү керек . Туруктуу контекст - бул an objectтердин инстанциялары маалымат базасындагы окшош an objectилер менен синхрондоштуруучу чөйрө (мен айткандай, бул туруктуу an objectтер үчүн гана иштейт). Эгер сиз JPAга тереңирээк кирсеңиз (мен аны абдан сунуштайм), сиз бул түшүнүктөрдү абдан көп жолуктурасыз.

56. Assert классы деген эмне? Эмне үчүн колдонсо болот?

Мен JPAда мындай классты уккан эмесмин, ошондуктан бул китепкананын JUnit классына тиешелүү деп ойлойм , ал codeду бирдикте тестирлөө үчүн колдонулат. Бул китепкананын классы, Assert , codeдун аткарылышынын натыйжаларын текшерүү үчүн колдонулат ( assert - бул сизде белгилүү бир жерде белгилүү бир абал/маалымат бар деген билдирүү). Мисалы, сиз мышык жаратышы керек болгон ыкманы сынап жатасыз. Сиз бир ыкманы иштетип, натыйжага жетишесиз:
Cat resultOfTest = createCat();
Бирок анын туура түзүлгөнүн текшериш керек, туурабы? Демек, сиз мурда белгилүү бир мышыкты - waitCat - мышыктан күткөндөй, createCat() ыкмасынан алынган параметрлер менен кол менен түздүңүз . Андан кийин, натыйжаларды текшерүү үчүн Assert классын колдоносуз :
Assert.assertEquals(resultOfTest, expectedCat);
Эгерде мышыктар башкача болсо, AssertionError өзгөчөлүгү ыргытылат , бул күтүлгөн натыйжалар бири-бирине дал келбей турганын билдирет. Assert классында күтүлгөн натыйжаларды текшерүү боюнча көптөгөн милдеттерди камтыган ар кандай ыкмалар бар. Бул жерде алардын кээ бирлери:
  • assertTrue(<boolean>) - аргумент катары алынган күтүлгөн маани чындык болушу керек

  • assertFalse(<boolean>) - аргумент катары алынган күтүлгөн маани жалган болушу керек

  • assertNotEquals(<object1>, <object2>) - аргумент катары алынган an objectтер барабар ( false ) менен салыштырганда ар түрдүү болушу керек

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

String

57. Java тorндеги сапты мүнөздөңүз

String Java тorндеги стандарттык класс, саптын маанилерин (символдордун ырааттуулугун) сактоо жана башкаруу үчүн жооптуу, өзгөрүлгүс класс ( мен өзгөрүлгүс жөнүндө мурда жазганмын ), б.а. Бул класстын an objectтеринин маалыматтары түзүлгөндөн кийин өзгөртүлбөйт. Мен StringBuilder жана StringBuffer класстары дээрлик бирдей эки класс экенин белгилеп кетким келет, алардын бир гана айырмасы, алардын бири көп жиптүү чөйрөдө (StringBuffer) колдонууга арналган. Бул класстар Stringге окшош , бирок андан айырмаланып, алар өзгөрмөлүү . Башкача айтканда, an objectтер түзүлгөндөн кийин, жаңы an object түзбөстөн, алар көрсөткөн сапты өзгөртүүгө мүмкүндүк берет. Чынында, ыкмалар стандарттуу 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);
Кээ бир an objectте иштеген toString ыкмасынын натыйжасында :
String str = someObject.toString();
Башка ыкманын натыйжасы сыяктуу эле, ал сап көрсөтүүнү кайтарат. Мисалы:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str =  reader.readLine();
Сиз түшүнгөндөй, сапты түзүү үчүн абдан көп жолдору болушу мүмкүн. String an objectи түзүлгөндө , ал сап бассейнинде сакталат , ал жөнүндө биз төмөндөгү суроолордун биринде кененирээк сүйлөшөбүз.

59. Java тorнде эки сапты кантип салыштырууга болот жана аларды кантип сорттоого болот?

Javaдагы маанилерди салыштыруу үчүн == кош барабар белгиси колдонулат . Эгерде бизге int сыяктуу жөнөкөй маанилерди салыштыруу керек болсо , анда биз аны колдонмокпуз. Бирок бул ыкма толук кандуу an objectилерди салыштыруу үчүн колдонулbyte. Бул учурда, бул шилтемелерди салыштыруу гана болот - алар бир эле an objectти көрсөтүп жатабы же жокпу. Башкача айтканда, эки an objectти ички талаалардын так бирдей маанилери менен салыштырганда, == аркылуу салыштыруу жалган жыйынтык берет : an objectтердин бирдей талааларына карабастан, an objectтердин өзү ар кандай эс тутум клеткаларын ээлейт. Ал эми String классынын an objectтери , алдамчы жөнөкөйлүгүнө карабастан, дагы эле an object болуп саналат. Жана == аркылуу салыштыруу да алар үчүн колдонулbyte (саптык бассейн бар болгонуна карабастан). Бул жерде Object классынын стандарттык ыкмасы ишке кирет - equals , ал туура иштеши үчүн класста жокко чыгарылышы керек (болбосо, демейки боюнча == менен салыштырылат ). Ал String классында жокко чыгарылган , ошондуктан биз аны алып, колдонобуз:
String firstStr = "Hello World!";
String secondStr = "Hello World!";
boolean isEquals = firstStr.equals(secondStr);
Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 6 - 6Биз дал келген салыштыруулар жөнүндө сүйлөштүк, эми салыштырууларды сорттоону карап көрөлү. Анткени, бир нерсени сорттоо үчүн кандай принцип боюнча сорттоо керектигин бorшибиз керек. Бул үчүн, стандарттуу сорттолгон топтомун колдоно аласыз - 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);
Консолдук чыгаруу:
А В С

60. Сапты символго айландыруунун алгоритмин бериңиз. Тиешелүү codeду жазыңыз

Мен жогоруда айткандай, String классынын an objectилеринде көптөгөн пайдалуу ыкмалар бар. Алардын бири 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