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

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

Дар гурӯҳ нашр шудааст
Салом! Барои устои чизе шудан чанд соат лозим аст? Ман бисёр вақт чунин чизеро шунидаам: "Барои устоди ҳама чиз шумо бояд 10,000 соат сарф кунед." Рақами даҳшатовар, ҳамин тавр не? Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 10-1Бо вуҷуди ин, ман ҳайронам, ки оё ин дуруст аст? Ва ман пайваста кӯшиш мекунам, ки бифаҳмам, ки ман аллакай чанд соатро барои азхуд кардани санъати барномасозӣ сарф кардам. Ва ҳангоме ки ман 10 000 соати азизро убур карда, устод мешавам, оё ин фарқиятро эҳсос мекунам? Ё ман аллакай бехабар аз болои онҳо қадам задам? Бо ин ё он роҳ, барои барномасоз шудан ба шумо лозим нест, ки чунин миқдори зиёди вақтро сарф кунед. Чизи асосй окилона истифода бурдани он аст. Ҳадафи асосии шумо гузаштан аз мусоҳиба аст. Ва дар мусоҳиба барои навкорон аввалин чизе, ки онҳо мепурсанд, назария аст, бинобар ин шумо бояд дар он қавӣ бошед. Воқеан, ҳангоми омодагӣ ба мусоҳиба, вазифаи шумо ин аст, ки ҳамаи камбудиҳои худро дар назарияи асосии таҳиягари Java кашф кунед ва онҳоро бо дониш фаро гиред. Ва имрӯз ман ба шумо дар ин масъала кӯмак хоҳам кард, зеро ман барои идома додани таҳлor саволҳои маъмултарин омадаам. Пас биёед идома диҳем!

89. ArrayList аз LinkedList чї тафовут дорад?

Ин яке аз саволҳои маъмултарин дар баробари савол дар бораи сохтори дохorи HashMap мебошад . Ягон мусоҳиба бе он анҷом намеёбад ва аз ин рӯ, ҷавоб ба он бояд "дандонҳои шуморо пошад". Илова бар он, ки маълум аст - номҳои гуногун - онҳо дар сохтори дохилӣ фарқ мекунанд. Қаблан, мо сохтори дохorи ҳам ArrayList ва ҳам LinkedList -ро тафтиш карда будем , аз ин рӯ ман ба тафсилоти татбиқи онҳо намеравам. Танҳо ба шумо хотиррасон мекунам, ки ArrayList дар асоси массиви дохилӣ амалӣ карда мешавад, ки мувофиқи формулаи зарурӣ зиёд карда мешавад:
<размерТекущегоМассива> * 3 / 2  + 1
Ҳамзамон, LinkedList дар асоси рӯйхати дукаратаи дохилӣ амалӣ карда мешавад, яъне ҳар як элемент дорои истинод ба қаблӣ ва оянда аст, ба истиснои арзишҳое, ки ибтидо/охири рӯйхат мебошанд. Одамон мехоҳанд ин саволро дар формат бидиҳанд: "Кадомаш беҳтар аст - ArrayList ё LinkedList ?", бо умеди он ки шуморо дастгир кунанд. Охир, агар ба яке аз онхо чавоб нишон дихед, чавоби нодуруст мешавад. Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 10 - 2Ба ҷои ин, шумо бояд фаҳмонед, ки шумо дар бораи кадом вазъияти мушаххас гап мезанед - дастрасӣ ба индекс ё ​​ворид кардан ба мобайни рӯйхат. Вобаста ба ҷавоб, шумо метавонед интихоби худро шарҳ диҳед. Ман қаблан тавсиф карда будам, ки чӣ тавр ArrayList ва LinkedList дар ин ё он вазъият кор мекунанд. Биёед инро бо гузоштани онҳо дар як саҳифа барои муқоиса ҷамъбаст кунем: Илова кардани элемент (илова кардан)
  1. Илова кардани унсури нав бе нишон додани индекс ҳамчун макон ба таври худкор дар охири ҳарду рӯйхат сурат мегирад. Дар LinkedList, унсури нав думи нав мешавад (танҳо аз нав навиштани ҷуфти пайванд ба амал меояд - O(1) мураккабии алгоритмӣ ).

    ArrayList ба охирин ячейкаи холии массив элементи нав илова мекунад - O(1 ) .

  2. Илова кардани элемент аз рӯи индекс одатан дохил кардани он тақрибан дар миёнаи рӯйхатро дар бар мегирад. Дар LinkedList, ҷои зарурӣ аввал тавассути номбар кардани унсурҳо аз "дум" ва "head" - O(n/2) ҷустуҷӯ карда мешавад ва сипас арзиш бо роҳи аз нав муайян кардани пайвандҳои элементҳое, ки дар байни онҳо элементи нав ҷойгир аст, ворид карда мешавад. дохил карда шудааст - O(1) . Мушкorи умумии алгоритмии ин амал O(n/2) хоҳад буд .

    ArrayList дар ин ҳолат як унсурро аз рӯи индекс - O(1) пайдо мекунад ва ҳамаи унсурҳои дар тарафи рост (аз ҷумла элементе, ки аллакай дар ин индекс нигоҳ дошта шудааст) як воҳид ба тарафи рост интиқол дода мешавад (ин метавонад эҷоди рӯйхат ва нусхабардории навро талаб кунад) элементҳо ба он) - O (n/2) . Мушкorи умумӣ O(n/2) аст .

  3. Илова кардани элемент ба аввали рӯйхат дар LinkedList вазъиятест, ки ба илова кардан ба охир монанд аст: унсури нав "сар"-и нав мешавад - O(1) дар айни замон, вақте ки ArrayList бояд ҳаракат кунад ҳама унсурҳо ба рост - O(n) .

Сатри поён: дар LinkedList, мураккабии алгоритмӣ аз O(1) то O(n/2) хоҳад буд . Яъне ҳар қадаре, ки воридкунӣ ба охир ё аввали рӯйхат наздик бошад, ҳамон қадар тезтар мешавад. Ҳамзамон, барои ArrayList он аз O(1) то O(n) фарқ мекунад : ҳар қадар воридкунӣ ба охири рӯйхат наздик бошад, ҳамон қадар тезтар мешавад. Ҷойгиркунии элемент (маҷмӯа) Ин амалиёт элементро ба мавқеъи муайяншуда дар рӯйхат менависад, агар мавҷуд бошад, бар болои мавқеи қаблӣ сабт мекунад. Дар LinkedList, ин амалиёт ба илова кардан монанд хоҳад буд, зеро Мушкилоти калонтарин дар ин ҷо пайдо кардани элемент аст. Навиштани элемент тавассути аз нав навиштани як ҷуфт пайвандҳо сурат мегирад, бинобар ин дар ин ҷо низ мураккабии алгоритмӣ вобаста ба масофаи мавқеъ аз охири ё аввали рӯйхат аз O(1) то O(n/2) хоҳад буд. Дар он вақт чашмаки зарурӣ дар ArrayList барои ин амалиёти индекс пайдо мешавад ва ба он элементи нав навишта мешавад. Ҷустуҷӯи индекс ба монанди ин амалиёт, мураккабии алгоритмии O(1) дорад . Элементро аз рӯи индекс гиред (гиред) Дар LinkedList, гирифтани элемент мувофиқи ҳамон принсипе, ки ҷустуҷӯи амалиёти дигар сурат мегирад - вобаста ба масофа аз интиҳо ё ибтидо, яъне. аз O(1) ба O(n/2) . Дар ArrayList , тавре ки ман қаблан гуфтам, пайдо кардани элемент дар массив аз рӯи индекс мураккабии O(1) дорад . Элементро аз рӯи индекс хориҷ кунед (нест кардан) Барои LinkedList, принсипи кори он низ дар ин ҷо кор мекунад: аввал элемент пайдо мешавад ва баъд истинодҳо дубора навишта мешаванд - ҳамсояҳои элемент ба ҳамдигар муроҷиат мекунанд ва истинодҳоро ба ин элемент гум мекунанд. баъдан аз ҷониби ҷамъкунандаи ахлот нест карда мешавад. Яъне, мураккабии алгоритмӣ ҳамоно ҳамон аст - аз O(1) то O(n/2) . Барои ArrayList , ин амалиёт бештар ба амалиёти илова кардани элементи нав (илова кардан) монанд аст. Аввал элементи зарурӣ пайдо мешавад - O(1) , баъд аз он хориҷ карда мешавад ва ҳамаи элементҳое, ки дар тарафи рости он буданд, як воҳид ба чап гузаронида мешаванд, то холигии ҳосилшуда пӯшонида шаванд. Амали тозакунӣ ҳамон мураккабии алгоритмиро дорад, ки амалиёти иловакунӣ - аз O(1) то O(n) . Чӣ қадаре ки ҳазф ба охири рӯйхат наздик бошад, ҳамон қадар мураккабии алгоритмии он камтар мешавад. Дар асл, ин ҳама амалиёти асосӣ буданд. Хотирнишон мекунам: хангоми мукоисаи ин ду руйхат, шумо бояд аник кунед, ки мо дар бораи кадом вазъияти конкретй сухан меронем ва он гох ба саволи гузошташуда бечуну чаро чавоб дода метавонед.

90. ArrayList аз HashSet бо чӣ фарқ дорад?

Агар ArrayList ва LinkedList-ро аз рӯи амалиёт муқоиса кардан мумкин аст, ки беҳтар аст - пас муқоиса кардани ArrayList бо HashSet он қадар осон нест , зеро ин коллексияҳои тамоман гуногунанд. Шумо метавонед як табақ ширинро бо дигараш муқоиса кунед, аммо он бо як табақ гӯштӣ кор мекунад - онҳо хеле фарқ мекунанд. Бо вуҷуди ин, ман кӯшиш мекунам, ки баъзе фарқиятҳоро байни онҳо баён кунам:
  • ArrayList интерфейси Рӯйхатро амалӣ мекунад , дар ҳоле ки HashSet интерфейси Setро амалӣ мекунад ;

  • Дар ArrayList, дастрасӣ бо индекси элемент имконпазир аст: амалиёти get дорои мураккабии алгоритмии O(1) аст ва дар HashSet унсури лозимиро танҳо бо қувваи бераҳмона ба даст овардан мумкин аст ва ин аз O(1) то O(n) аст. ;

  • ArrayList ба унсурҳои такрорӣ иҷозат медиҳад. Дар HashSet, ҳама унсурҳо беназиранд: илова кардани элемент ба HashSet , ки аналоги он аллакай дар коллексия мавҷуд аст, кор намекунад (дубликатҳо бо истифода аз hashcode тафтиш карда мешаванд, аз ин рӯ номи ин коллексия);

  • ArrayList бо истифода аз массиви дохилӣ амалӣ карда мешавад ва HashSet бо истифода аз HashMap дохилӣ амалӣ карда мешавад ;

  • ArrayList тартиби воридкунии элементҳоро нигоҳ медорад, дар ҳоле ки HashSet маҷмӯи бетартибона аст ва тартиби элементҳоро нигоҳ намедорад;

  • ArrayList имкон медиҳад, ки ҳар як миқдори арзишҳои холӣ (null), танҳо як арзиши нулро ба HashSet ворид кардан мумкин аст (дар ниҳоят, беназирии элементҳо).

91. Чаро дар Java ин қадар гуногуни амалисозии массивҳои динамикӣ мавҷуд аст?

Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 10 - 3Хуб, ин бештар саволи фалсафӣ аст. Хуб, чаро онҳо ин қадар технологияҳои нави гуногунро таҳия мекунанд? Барои роҳат. Дар асл, бо шумораи зиёди татбиқи массивҳои динамикӣ ҳамин тавр аст. Ҳеҷ кадоми онҳоро беҳтарин ё идеал номидан мумкин нест. Ҳар яке дар баъзе ҳолатҳо бартарият дорад. Ва вазифаи мо аз он иборат аст, ки тафовут, ҷиҳатҳои қавӣ/заъфи онҳоро донем: то тавонанд дар шароити дуруст аз ҳама мувофиқтаринро истифода барем.

92. Чаро дар Java чунин гуногуни татбиқи нигаҳдории калидҳо мавҷуданд?

Дар ин ҷо вазъ ҳамон тавре ки татбиқи массивҳои динамикӣ вуҷуд дорад. Ҳеҷ кас беҳтарин нест: ҳар яки онҳо ҷиҳатҳои қавӣ ва заиф доранд. Ва мо, албатта, бояд аз кувваи худ бештар истифода барем. Мисол: маҷмӯаи ҳамзамон, ки дорои бисёр технологияҳои бисёрсоҳавӣ мебошад, коллексияҳои Concurrent- и худро дорад . Ҳамон ConcurrentHashMap дар бехатарии кори чанд ришта бо додаҳо дар муқоиса бо HashMap муқаррарӣ бартарӣ дорад , аммо дар муҳити ғайридавлатӣ он суръатро аз даст медиҳад. Хуб, татбиқҳое, ки дар ҳама ҳолат қавитарин нестанд, тадриҷан истифода намешаванд. Мисол: Hashtable дар ибтидо як HashMap аз ришта бехатар буд , аммо ConcurrentHashMap аз он дар муҳити чанд ришта бартарӣ дошт ва Hashtable дар ниҳоят фаромӯш шуд ва дигар истифода нашуд.

93. Маљмўи элементњо чї тавр љорї карда мешавад?

Аввалин чизе, ки бояд гуфт, ин аст, ки синфи элементи коллексия бояд интерфейси муқоисашаванда ва усули муқоисашавандаи онро татбиқ кунад . Ё ба шумо синфе лозим аст, ки Comaprator -ро бо усули муқоисакунандаи худ амалӣ мекунад . Шумо метавонед бештар дар бораи онҳо дар ин мақола бихонед . Ҳарду усул муайян мекунанд, ки чӣ гуна an objectҳои навъи додашуда бояд муқоиса карда шаванд. Ҳангоми ҷудокунӣ, ин хеле муҳим аст, зеро шумо бояд принсиперо фаҳмед, ки бо кадом унсурҳо муқоиса кардан мумкин аст. Роҳи асосии ин амалисозии Comparable мебошад , ки бевосита дар синфе, ки шумо мехоҳед ҷудо кунед. Дар баробари ин, истифодаи Comparator камтар маъмул аст. Фарз мекунем, ки шумо синферо аз баъзе китобхона истифода мебаред, ки татбиқи муқоисашаванда надорад , аммо ба шумо лозим меояд, ки онро бо ягон роҳ ҷудо кунед. Бе имкони тағир додани рамзи ин синф (ба истиснои васеъ кардани он), шумо метавонед татбиқи Comparator нависед , ки дар он шумо нишон медиҳед, ки бо кадом принсип an objectҳои ин синфро муқоиса кардан мехоҳед. Ва як мисоли дигар. Фарз мекунем, ки ба шумо барои ҷудокунии an objectҳои як намуд принсипҳои гуногун лозиманд, бинобар ин шумо якчанд Муқоисакунандаҳоро менависед , ки дар ҳолатҳои гуногун истифода мебаред. Чун қоида, бисёр синфҳо аз қуттӣ аллакай интерфейси муқоисашавандаро амалӣ мекунанд - ҳамон String . Дар асл, ҳангоми истифодаи онҳо, шумо набояд дар бораи муқоиса кардани онҳо хавотир шавед. Шумо танҳо онҳоро гиред ва истифода баред. Роҳи аввал ва равшантарин ин истифодаи коллексияи навъи TreeSet ё TreeMap мебошад , ки унсурҳоро бо тартиби аллакай мураттабшуда мувофиқи муқоисакунандаи синфи элементҳо нигоҳ медорад. Дар хотир доред, ки TreeMap калидҳоро ҷудо мекунад, аммо арзишҳо не. Агар шумо ба ҷои Comparable татбиқи Comparator -ро истифода баред , ба шумо лозим меояд, ки ҳангоми эҷод an objectи онро ба конструктори коллексия интиқол диҳед:
TreeSet treeSet = new TreeSet(customComparator);
Аммо чӣ мешавад, агар шумо як намуди дигари коллексия дошта бошед? Онро чӣ гуна бояд ҷудо кард? Дар ин ҳолат, усули дуюми синфи утorтаи Collections мувофиқ аст - усули sort() . Он статикӣ аст, бинобар ин ба шумо танҳо номи синф ва усуле лозим аст, ки ба он рӯйхати зарурӣ интиқол дода мешавад. Барои намуна:
Collections.sort(someList);
Агар шумо Comparable -ро истифода набаред , балки татбиқи Comparator -ро истифода баред, шумо бояд онро ҳамчун параметри дуюм гузаронед:
Collections.sort(someList, customComparator);
Дар натиља тартиби дохorи элементњои рўйхати гузаронидашуда таѓйир меёбад: он аз рўи муќоисакунандаи элемент мураттаб карда мешавад. Ман қайд мекунам, ки рӯйхати интиқоли элементҳо бояд тағирёбанда бошад, яъне. тағйирёбанда, вагарна усул кор намекунад ва UnsupportedOperationException партофта мешавад . Ҳамчун роҳи сеюм , шумо метавонед амалиёти ҷараёнро истифода баред , ки унсурҳои коллексияро мураттаб мекунад, агар татбиқи муқоисашаванда истифода шавад :
someList = someList.stream().sorted().collect(Collectors.toList());
агар муқоисакунанда :
someList = someList.stream().sorted(customComparator).collect(Collectors.toList());
Шумо метавонед бештар дар бораи Stream дар ин мақола хонед . Усули чорум ин ба таври дастӣ татбиқ кардани навъбандӣ, ба монанди навъбандии ҳубобӣ ё якҷоякунии sort мебошад .

ClassObject. Баробар ва HashCode

94. Тавсифи мухтасари an objectи синфро дар Java гузоред

Дар қисми дуюми таҳлил, мо аллакай дар бораи усулҳои синфи Object сӯҳбат кардем ва ман ба шумо хотиррасон мекунам, ки синфи Object пешвои ҳама синфҳо дар Java мебошад. Он дорои 11 усул аст, ки мутаносибан ба ҳама синфҳо мерос мондаанд. Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 10 - 4Маълумотро дар бораи ҳамаи 11 усул дар қисми дуюми муҳокима пайдо кардан мумкин аст.

95. Equals ва HashCode дар Java барои чӣ истифода мешаванд?

hashCode() усули синфи Object мебошад , ки аз ҷониби ҳама синфҳо мерос гирифта мешавад. Вазифаи он тавлид кардани рақаме мебошад, ки an objectи мушаххасро ифода мекунад. Намунаи истифодаи ин усул истифодаи он дар HashMap дар an objectи калидӣ барои муайян кардани минбаъдаи хэшcodeи маҳаллӣ мебошад, ки ҳуҷайраи массиви дохorи (сатил), ки дар он ҷуфт нигоҳ дошта мешавад, муайян мекунад. Мо дар бораи кори HashMap дар қисми 9-и таҳлил муфассал сӯҳбат кардем , аз ин рӯ мо дар ин бора зиёд таваққуф нахоҳем кард. Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 10 - 5Инчунин, чун қоида, ин усул дар усули equals() ҳамчун яке аз воситаҳои асосии он барои муайян кардани шахсияти an objectҳо истифода мешавад. equals() усули синфи Object мебошад , ки вазифаи он муқоисаи an objectҳо ва муайян кардани онҳо баробар аст ё не. Ин усул дар ҳама ҷое истифода мешавад, ки мо бояд an objectҳоро муқоиса кунем, зеро муқоисаи муқаррарии == барои an objectҳо мувофиқ нест, зеро танҳо пайвандҳоро ба онҳо муқоиса мекунад.

96. Дар бораи шартномаи байни Equals ва HashCode дар Java ба мо бигӯед?

Аввалин чизе, ки ман мегӯям, ин аст, ки барои дуруст кор кардани усулҳои equals() ва hashCode() онҳо бояд дуруст бекор карда шаванд. Пас аз ин, онҳо бояд қоидаҳоро риоя кунанд:
  • an objectҳои якхела, ки барои онҳо муқоиса тавассути баробар баргардонидани ҳақиқӣ аст, бояд рамзҳои хэши якхела дошта бошанд ;
  • an objectҳои дорои рамзҳои шудаи якхела метавонанд на ҳамеша баробар бошанд.
Дар ин лаҳза мо то қисми навбатии таҳлил таваққуф хоҳем кард!Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 10 - 6
Дигар маводҳо дар силсила:
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION