JavaRush /Блоги Java /Random-TG /Таҳлили саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари ...

Таҳлили саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java. Қисми 6

Дар гурӯҳ нашр шудааст
Салом Ҷаҳон! Давом додани рушд барои ҳар як таҳиягар хеле муҳим аст. Дар ниҳоят, агар шумо таваққуф кунед, хатари беасос шудан ва комилан аз бозор берун рафтан вуҷуд дорад: ҷаҳони IT пайваста рушд мекунад ва пеш меравад ва шумо бояд бо он ҳаракат кунед. Вале хатто дар баробари ин на танхо ба технологияи наву тоза таваччух кардан мумкин нест, то ки, гуем, классиконро (мавзуъхои классикиро) фаромуш накунад. Имрӯз ман мехоҳам таҳлor саволҳои худро дар мавзӯъҳои "классикӣ" барои таҳиягари Java идома диҳам. Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 6-1Ман қайд мекунам, ки ҷавобҳои ман қудрати ниҳоӣ нестанд - маҳз ҳамин тавр ман ҷавобҳои дурустро ба ин саволҳоро мебинам ва шумо шояд бо баъзеи онҳо розӣ набошед. Ин хеле муқаррарӣ хоҳад буд, бинобар ин озодона фикру ақидаи худро дар шарҳҳо мубодила кунед. Истинодҳо ба қисмҳои таҳлил дар охири мақола мебошанд.Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 6-2

Китобхонаҳо ва стандартҳо

52. Гибернат чист? Фарқи байни JPA ва Hibernate чист?

Ман фикр мекунам, ки барои посух додан ба ин савол, мо аввал бояд фаҳмем, ки JPA чист . JPA мушаххасотест, ки харитасозии an objectи марбути an objectҳои Java-ро тавсиф мекунад ва API-ро барои нигоҳдорӣ, дарёфт ва коркарди чунин an objectҳо таъмин мекунад. Яъне, тавре ки мо дар ёд дорем, базаҳои маълумотҳои релятсионӣ (МБ) дар шакли ҷадвалҳои зиёди ба ҳам алоқаманд пешниҳод карда мешаванд. Ва JPA стандарти ба таври васеъ пазируфташуда мебошад, ки тасвир мекунад, ки чӣ гуна an objectҳо метавонанд бо пойгоҳи додаҳои релятсионӣ ҳамкорӣ кунанд. Тавре ки шумо мебинед, JPA чизи абстрактӣ ва ғайримоддӣ аст. Он мисли худи идея, равиш аст. Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 6-3Ҳамзамон, Hibernate китобхонаи мушаххасест, ки парадигмаҳои JPA- ро амалӣ мекунад . Яъне, бо ёрии ин китобхона шумо метавонед бо пойгоҳи додаҳои релятсионӣ тавассути an objectҳое кор кунед, ки маълумотро аз пойгоҳи додаҳо (Entity) ифода мекунанд. Тавре ки мегӯянд, ин китобхона ба идеалҳои JPA хеле наздик аст ва шояд аз ҳамин сабаб маъмул гаштааст. Ва чунон ки шумо мефаҳмед, маъруфияти истифода далели хуб барои рушд ва такмor минбаъда аст. Илова бар ин, дар паси истифодаи зуд-зуд он як ҷомеаи бузурге ҳаст, ки аллакай ҳама саволҳои имконпазир ва ғайриимкони марбут ба ин асбобро мураттаб кардааст. Ин аст як мисоли китобе , ки ҳама гӯшаҳои торикии ин технологияро муфассал баррасӣ мекунад. Яъне, Hibernate ба қадри имкон омӯхта шудааст ва маълум мешавад, ки эътимоднок аст. Дар асл, бесабаб нест, ки ҳатто татбиқи идеалии JPA дар тарафи баҳор одатан Hibernate-ро дар зери сарпӯш истифода мебарад.

53. Каскадї чист? Он дар Hibernate чӣ гуна истифода мешавад?

Тавре ки ман қаблан гуфта будам, дар ҳолати интизорӣ муошират тавассути an objectҳои додаҳо бо номи an objectҳо сурат мегирад . Ин an objectҳо баъзе ҷадвалҳои мушаххасро дар пойгоҳи додаҳо муаррифӣ мекунанд ва тавре ки шумо дар ёд доред, дар синфҳои Java метавонанд истинодҳоро ба синфҳои дигар дошта бошанд. Ин муносибатҳо дар базаи маълумот инъикос меёбанд. Дар пойгоҳи додаҳо, чун қоида, инҳо ё калидҳои хориҷӣ (барои OneToOne, OneToMany, ManyToOne) ё ҷадвалҳои мобайнӣ (барои ManyToMany) мебошанд.Шумо метавонед дар бораи муносибати байни an objectҳо дар ин мақола бештар хонед . Вақте ки муассисаи шумо ба дигар an objectҳои алоқаманд пайванд дорад, шарҳҳо дар болои ин истинодҳо барои нишон додани намуди пайваст ҷойгир карда мешаванд: @OneToOne, @OneToMany, @ManyToOne, @ManyToMane, ки дар параметрҳои онҳо шумо метавонед арзиши амволро муайян кунед - каскад - навъи каскад барои ин пайваст. JPA дорои усулҳои мушаххаси мутақобила бо an objectҳо мебошад (фосила кардан, захира кардан, якҷоя кардан ...) . Навъҳои каскадӣ дақиқ барои нишон додани он, ки маълумоти алоқаманд ҳангоми истифодаи ин усулҳо дар an objectи мавриди ҳадаф чӣ гуна бояд рафтор кунанд, истифода мешаванд. Пас, стратегияҳои каскадӣ (намудҳои каскад) кадомҳоянд? Стандарти JPA истифодаи шаш намуди каскадро дар назар дорад:
  • PERSIST - амалиёти захиракунӣ дар каскад сурат мегирад (барои усулҳои save() ва persist() ). Яъне, агар мо як an objectи бо дигар an objectҳо алоқамандро захира кунем, онҳо низ дар пойгоҳи додаҳо захира карда мешаванд (агар онҳо ҳоло дар он ҷо набошанд)

  • MERGE - амалиёти навсозӣ дар каскад сурат мегирад (барои усули merge() )

  • REMOVE - амалиёти бартарафкунӣ дар каскад сурат мегирад ( усули хориҷ () )

  • ҲАМАИ - якбора се амалиёти каскадиро дар бар мегирад - ИСТИФОДА НАМУДАН - МЕШАВӢ - НАЗАР КАРДАН

JPA дорои мафҳуми субъекти доимӣ - an objectе мебошад, ки бо маълумоти он дар пойгоҳи додаҳо алоқаманд аст, ки аз ҷониби сессияи ҷорӣ (пайвастшавӣ) идора карда мешавад . Агар шумо онро тағир диҳед, аммо тағиротро дар базаи маълумот захира накунед, маълумоти он дар пойгоҳи додаҳо тағир дода мешавад.
  • Объектҳои марбут ба DETACH бо сеанс идора карда намешаванд ( усули detach() ). Яъне, вақте ки онҳо тағир меёбанд, дар маълумоти онҳо дар пойгоҳи додаҳо тағироти автоматӣ ба амал намеояд - онҳо аз ҳолати доимӣ ба ҷудошуда интиқол дода мешаванд (an objectе, ки аз ҷониби JPA идора намешавад)

  • REFRESH - ҳар дафъае, ки an object бо маълумот аз пойгоҳи додаҳо нав карда мешавад ( refresh() - an objectҳои ҷудошударо навсозӣ мекунад), an objectҳои марбут ба ҳамин тарз нав карда мешаванд. Масалан, шумо ягон хел маълумотеро, ки аз базаи маълумот гирифта шудааст, иваз кардаед ва мехоҳед арзишҳои аслии онро баргардонед. Дар ин ҳолат, ин амалиёт барои шумо муфид хоҳад буд.

Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 6-4Hibernate ҳамаи ин амалиёти каскади стандартиро дастгирӣ мекунад, аммо инчунин се амалиёти худро муаррифӣ мекунад:
  • REPLICATE - Вақте ки мо зиёда аз як манбаи маълумот дорем ва мо мехоҳем, ки маълумот ҳамоҳанг карда шавад, истифода мешавад (Усули интизорӣ - такрорӣ). Ҳама an objectҳо бояд идентификаторҳо (id) дошта бошанд, то ки дар тавлиди онҳо мушкилот ба вуҷуд наояд (то он ки як an object барои пойгоҳи додаҳои гуногун ID-ҳои гуногун надошта бошад)

  • SAVE_UPDATE - каскади захира/нест кардан (барои усули Hibernate - saveOrUpdate )

  • LOCK амалиёти баръакс ба DETACHED аст : он an objectи ҷудошударо ба ҳолати устувор бармегардонад , яъне. an object аз ҷониби сессияи ҷорӣ боз пайгирӣ карда мешавад

Агар навъи каскадӣ интихоб нашуда бошад, ҳеҷ гуна амалиёт дар an object ба дигар an objectҳои марбут ба он таъсир намерасонад.

54. Оё синфи Entity абстрактӣ буда метавонад?

Дар мушаххасоти JPA дар банди 2.1 Синфи an object сатр мавҷуд аст: " Ҳам синфҳои абстрактӣ ва ҳам мушаххас метавонанд an objectҳо бошанд ." Пас, ҷавоб ҳа аст, синфи абстрактӣ метавонад an object бошад ва онро бо @Entity шарҳ додан мумкин аст.

55. Менеҷери субъект чист? Ӯ барои чӣ масъул аст?

Пеш аз ҳама, мехоҳам қайд намоям, ки EntityManager яке аз ҷузъҳои асосии JPA мебошад , ки барои ҳамкории субъектҳо бо пойгоҳи додаҳо истифода мешавад. Дар маҷмӯъ, он усулҳои ҳамкории байни an object ва базаи маълумотро (присист, якҷоякунӣ, нест кардан, ҷудо кардан) меноманд... Аммо ман инчунин қайд мекунам, ки ин компонент, чун қоида, барои тамоми барнома як нест: аксар вақт он сабук аст ва аксар вақт хориҷ карда мешавад ва наваш бо истифода аз EntityManagerFactory сохта мешавад . Агар мо параллелро бо JDBC кашем , ки дар он EntityManagerFactory аналоги DataSource хоҳад буд , пас EntityManager, дар навбати худ, аналоги Пайвастшавӣ хоҳад буд . Пештар ман як воҳиди устуворро ҳамчун an objectе зикр кардам, ки тавассути пайвасти ҷорӣ идора карда мешавад. Ҳамин тавр: ин an object маҳз аз ҷониби EntityManager идора карда мешавад , ки бо пайвасти ҷорӣ ва TransactionManager , ки барои кушодан/пӯшонидани транзаксияҳо масъул аст, зич алоқаманд аст. Илова бар ин дар расми зер шумо метавонед давраи зиндагии an objectро бубинед: Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 6-5EntityManager an objectро дар марҳилаи идорашаванда идора мекунад (дар айни замон он доимист, зеро он бо EntityManager робита дорад). Яъне, он дигар нав нест ва ҳанӯз бардошта нашудааст. Мо метавонем бигӯем, ки вақте ки an object нав аст ё хориҷ карда мешавад, он ҳам ҷудо мешавад, зеро онро EntityManager идора намекунад. Барои EntityManager стратегияҳои гуногун мавҷуданд. Яъне, барои тамоми барнома як EntityManager ягона мавҷуд буда метавонад ё ҳар дафъа барои ҳар як пайвастшавӣ як нав эҷод кардан мумкин аст. Агар шумо Spring-ро истифода баред, пас эҷод/несткунии EntityManager ба таври худкор дар зери сарпӯш идора карда мешавад (аммо ин маънои онро надорад, ки шумо онро танзим карда наметавонед ^^). Бояд гуфт, ки як ё якчанд EntityManager контексти устувориро ташкил медиҳанд . Контексти устуворӣ муҳити зистест, ки дар он мисолҳои an objectҳо бо an objectҳои шабеҳ дар пойгоҳи додаҳо ҳамоҳанг карда мешаванд (чунон ки ман гуфтам, ин танҳо барои an objectҳои доимӣ кор мекунад). Агар шумо ба JPA амиқтар омӯзед (ки ман онро хеле тавсия медиҳам), шумо бо ин мафҳумҳо зуд-зуд дучор хоҳед шуд.

56. Синфи Assert чист? Чаро онро истифода баред?

Ман дар бораи чунин синф дар JPA нашунидаам , бинобар ин ман фикр мекунам, ки ин ба синфи JUnit китобхона дахл дорад, ки барои санҷиши воҳиди code истифода мешавад. Синфи ин китобхона, Assert , барои тафтиши натиҷаҳои иҷроиши code истифода мешавад ( таъкид изҳоротест, ки шумо дар ҷои муайян ҳолат/маълумот доред). Масалан, шумо усулеро меозмоед, ки бояд гурба эҷод кунад. Шумо як усулро иҷро мекунед ва натиҷа мегиред:
Cat resultOfTest = createCat();
Аммо шумо бояд боварӣ ҳосил кунед, ки он дуруст офарида шудааст, дуруст? Аз ин рӯ, шумо қаблан як гурбаи муайян - expectCat -ро дастӣ бо параметрҳое, ки шумо аз гурбае, ки аз усули createCat() гирифтаед, интизор будед . Баъдан, шумо синфи Assertро барои тафтиши натиҷаҳо истифода мебаред:
Assert.assertEquals(resultOfTest, expectedCat);
Агар гурбаҳо гуногун бошанд, истиснои AssertionError партофта мешавад , ки ба мо мегӯяд, ки натиҷаҳои интизоршуда ба ҳам намеоянд. Синфи Assert дорои усулҳои гуногуни гуногун мебошад, ки бисёре аз вазифаҳои санҷиши натиҷаҳои интизоршударо дар бар мегирад. Дар ин ҷо баъзе аз онҳо ҳастанд:
  • assertTrue(<boolean>) - арзиши интизоршуда, ки ҳамчун аргумент гирифта мешавад, бояд дуруст бошад

  • assertFalse(<boolean>) - арзиши интизоршуда ҳамчун аргумент бояд бардурӯғ бошад

  • assertNotEquals(<object1>, <object2>) - an objectҳои ҳамчун аргумент гирифташуда бояд ҳангоми муқоиса бо истифода аз баробар ( бардурӯғ ) гуногун бошанд

  • assertThrows(<ClassNameOfException>.class, <exceptionObject>) - интизор меравад, ки аргументи дуюм истиснои синфе бошад, ки аз тарафи аргументи аввал муайян шудааст (яъне, чун қоида, ба ҷои далели дуюм, методе номида мешавад, ки бояд истиснои намуди лозимиро партоед)

Сатр

57. Характеристикаи сатр дар Java

String як синфи стандартӣ дар Java мебошад, ки барои нигоҳдорӣ ва коркарди арзишҳои сатр (пайдарпаймоии аломатҳо) масъул аст, синфи тағирнопазир аст ( ман қаблан дар бораи тағирнопазир навишта будам ), яъне. Маълумоти an objectҳои ин синфро пас аз эҷод кардан тағир додан мумкин нест. Мехоҳам фавран қайд намоям, ки синфҳои StringBuilder ва StringBuffer ду синфи амалан якхелаанд ва ягона фарқият дар он аст, ки яке аз онҳо барои истифода дар муҳити бисёрсоҳавӣ пешбинӣ шудааст (StringBuffer). Ин синфҳо ба String монанданд , аммо бар хилофи он, онҳо тағирёбанда мебошанд . Ин аст, ки an objectҳо пас аз офарида шудан, тағир додани сатри онҳоро бидуни эҷоди an objectи нав иҷозат медиҳанд. Дар асл, усулҳо аз усулҳои стандартии String фарқ мекунанд ва ба қонеъ кардани ниёзҳои тағир додани сатр нигаронида шудаанд (беҳуда нест, ки онҳоро бинокор меноманд). Дар ин мақола дар бораи String , StringBuffer ва StringBuilder маълумоти бештар гиред .

58. Роҳҳои гуногуни сохтани an objectи String кадомҳоянд? Дар куҷо офарида шудааст?

Роҳи маъмултарини эҷоди сатр ин танҳо муайян кардани арзишест, ки ба мо дар қавсҳои дукарата лозим аст:
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 дар ягон an object кор мекунад:
String str = someObject.toString();
Мисли натиҷаи ҳама гуна усули дигар, он намоиши сатрро бармегардонад. Барои намуна:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str =  reader.readLine();
Тавре ки шумо фаҳмед, роҳҳои эҷоди сатр метавонад хеле ва хеле зиёд бошад. Вақте ки an objectи String сохта мешавад, он дар ҳавзи сатр нигоҳ дошта мешавад , ки мо дар бораи он дар яке аз саволҳои зер муфассалтар сӯҳбат хоҳем кард.

59. Дар Java ду сатрро чї тавр муќоиса кардан мумкин аст ва онњоро чї тавр људо кардан мумкин аст?

Java барои муқоисаи арзишҳо аломати ду баробар == -ро истифода мебарад . Агар ба мо лозим ояд, ки баъзе арзишҳои оддиро ба мисли int муқоиса кунем , мо онро истифода мебурдем. Аммо ин усул барои муқоисаи an objectҳои мукаммал истифода намешавад. Дар ин ҳолат, он танҳо муқоисаи истинодҳо хоҳад буд - хоҳ онҳо ба як an object ишора мекунанд ё не. Ин аст, ки ҳангоми муқоисаи ду an object бо арзишҳои дақиқи майдонҳои дохилӣ, муқоиса тавассути == натиҷаи нодуруст медиҳад : сарфи назар аз майдонҳои якхелаи 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);
Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари 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);
Натиҷаи консол:
А В В

60. Алгоритми ба аломат табдил додани сатрро нишон диҳед. Рамзи мувофиқро нависед

Тавре ки ман қаблан гуфтам, an objectҳои синфи String дорои усулҳои гуногуни муфид мебошанд. Яке аз инҳо toCharArray мебошад . Ин усул сатрро ба массиви аломатҳо табдил медиҳад:
String str = "Hello world";
char[] charArr = str.toCharArray();
Дар оянда мо як қатор аломатҳо дорем, ки онҳоро аз рӯи индекс даъват карда метавонем:
char firstChar = charArr[0]; // H

61. Чӣ тавр сатрро ба массиви byteӣ ва ақиб табдил додан мумкин аст? Рамзи мувофиқро нависед

Монанди усули toCharArray , синфи String дорои усули getBytes мебошад , ки массиви byteҳои сатрро бармегардонад:
String str = "Hello world";
byte[] byteArr = str.getBytes();
byte firstChar = byteArr[6]; // 119
Бахши имрузаи тахлил мантики ба охир расид. Ба диққататон ташаккур!Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 6-7
Дигар маводҳо дар силсила:
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION