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

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

Дар гурӯҳ нашр шудааст
Фейерверк! Барномасоз будан осон нест. Шумо бояд доимо омӯзед, ҳамеша чизи навро омӯзед. Аммо, чун дар ҳама гуна тиҷорат, аз ҳама мушкил ин оғоз кардан, гузоштани қадами аввалин ба сӯи ҳадафи худ аст. Ва азбаски шумо дар ин сайт нишастаед ва ин мақоларо мехонед, қадами аввалро анҷом додед. Ин маънои онро дорад, ки ҳоло ба шумо лозим аст, ки мақсаднок ба сӯи ҳадафи худ ҳаракат кунед, бидуни суръат ё хомӯш кардани роҳ. Агар ман дуруст фаҳмам, ҳадафи шумо таҳиягари Java шудан ё такмил додани дониши шумост, агар шумо яке бошед. Агар ин тавр бошад, пас шумо дар ҷои дуруст ҳастед, зеро мо таҳлor рӯйхати васеи 250+ саволҳои мусоҳибаи таҳиягари Java-ро идома медиҳем. Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 9-1Биёед идома диҳем!

Маҷмӯаҳо

84. Дар бораи итераторҳо ва истифодаи онҳо ба мо нақл кунед

Коллексияҳо яке аз мавзӯъҳои дӯстдоштаи ҳар мусоҳибаи таҳиягари Java мебошанд ва ҳангоми сухан дар бораи иерархияи коллексия, номзадҳо аксар вақт мегӯянд, ки он аз интерфейси Коллексия оғоз мешавад . Аммо ин дуруст нест, зеро дар болои ин интерфейс дигаре ҳаст - Iterable . Ин интерфейс усули iterator() -ро ифода мекунад, ки ба шумо имкон медиҳад an objectи Iterator -ро барои коллексияи ҷорӣ даъват кунед . Ва ин an objectи Iterator маҳз чист ? Итератор an objectест, ки қобorяти ҳаракат дар коллексия ва такрори элементҳоро бидуни истифодаи корбар барои донистани татбиқи коллексияи мушаххасро таъмин мекунад. Яъне, ин як навъ ишора ба унсурҳои коллексия аст, ки гӯё ба ҷои муайяни он назар мекунад. Итератор дорои усулҳои зерин аст:
  • hasNext() - ҳақиқиро бармегардонад , агар элементе пас аз нишоннамо ҷойгир бошад (ин усул ба шумо имкон медиҳад фаҳмед, ки оё ба охири коллексия расидааст ё не);
  • next() - элементи навбатиро пас аз нишондод бармегардонад. Агар вуҷуд надошта бошад, NoSuchElementException партофта мешавад . Яъне, пеш аз истифодаи ин усул, беҳтар аст боварӣ ҳосил кунед, ки элемент мавҷуд аст - using hasNext() ;
  • remove() - унсури охирини аз коллексия гирифташударо бо истифода аз усули next() хориҷ мекунад . Агар пеш аз он ки remove() даъват карда шавад, next() ҳеҷ гоҳ даъват нашуда бошад , истисно партофта мешавад - IllegalStateException ;
  • forEachRemaining(<Consumer>) - амали гузаронидашударо бо ҳар як элементи коллексия иҷро мекунад (усул дар Java 8 пайдо шудааст).
Дар ин ҷо як мисоли хурди такрори рӯйхат ва хориҷ кардани ҳамаи унсурҳои он бо истифода аз усулҳои итератори мавриди баррасӣ қарор дорад:
List<String> list = new ArrayList<>();
list.add("Hello ");
list.add("World, ");
list.add("It's ");
list.add("Amigo!");
Iterator iterator = list.iterator();

while(iterator.hasNext()) {
   iterator.next();
   iterator.remove();
}
System.out.println(list.size());
Консол нишон медиҳад:
0
Ин маънои онро дорад, ки бартараф кардани элементҳо муваффақ буд. Вақте ки мо итератор доштем, мо метавонем як усулро барои чоп кардани ҳамаи элементҳо дар экран истифода барем:
iterator.forEachRemaining(x -> System.out.print(x));
Аммо баъд аз ин, итератор барои истифодаи минбаъда корношоям хоҳад шуд, зеро он тамоми рӯйхатро убур мекунад ва итератори муқаррарӣ усулҳои бозгаштро надорад. Дар ин ҷо мо тадриҷан ба LinkedList , яъне усули listIterator() наздик мешавем , ки навъи муосири итератор - ListIterator -ро бармегардонад . Ба ғайр аз усулҳои итератории муқаррарӣ (стандартӣ), ин усул усулҳои иловагӣ дорад:
  • add(<Элемент>) - ба рӯйхат элементи нав дохил мекунад;
  • hasPrevious() - ҳақиқиро бар мегардонад , агар элементе дар пеш аз нишоннамо ҷойгир бошад (оё элементи қаблӣ вуҷуд дорад);
  • nextIndex() - индексро дар рӯйхати элементи навбатӣ пас аз нишоннамо бармегардонад;
  • previous() - элементи пештараро бармегардонад (то нишондињанда);
  • previousIndex () - индекси элементи қаблиро бармегардонад;
  • set(<Элемент>) - Элементи охирини бо усулҳои навбатӣ() ё қаблӣ() баргардонидашударо иваз мекунад .
Тавре ки шумо мебинед, функсияи ин итератор хеле ҷолибтар аст: он ба шумо имкон медиҳад, ки дар ду самт ҳаракат кунед ва ҳангоми кор бо элементҳо дастҳои шуморо озод мекунад. Инчунин, вақте ки одамон дар бораи итераторҳо сӯҳбат мекунанд, онҳо баъзан худи намунаро дар назар доранд. Барои он ки ба мушкилот дучор нашавед ва дар бораи он ба таври боварибахш сӯҳбат кунед, ин мақоларо дар бораи намунаи Iterator хонед . Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 9-2

85. Дар Java Collection Framework иерархияи коллексия чист?

Дар Java ду иерархияи коллексия мавҷуд аст. Иерархияи аввал худи иерархияи Коллексия бо сохтори зерин мебошад : Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 9-3Он, дар навбати худ, ба зермаҷмӯаҳои зерин тақсим мешавад:
  • Маҷмӯа интерфейсест, ки чунин сохтори додаҳоро ҳамчун маҷмӯи дорои унсурҳои беназири (такрорнашаванда) тавсиф мекунад. Интерфейс дорои татбиқи стандартӣ - TreeSet , HashSet ва LinkedHashSet .
  • Рӯйхат интерфейсест, ки сохтори маълумотро тавсиф мекунад, ки пайдарпаии фармоишии an objectҳоро нигоҳ медорад. Мисолҳое, ки дар Рӯйхат мавҷуданд , метавонанд аз рӯи индекси онҳо дар ин коллексия ворид ва нест карда шаванд (ба массив монанд, аммо бо тағир додани андозаи динамикӣ). Интерфейс дорои татбиқи стандартӣ - ArrayList , Vector ( кӯҳнашуда ҳисобида мешавад ва воқеан истифода намешавад ) ва LinkedList .
  • Навбат интерфейсест, ки сохтори додаҳоро тавсиф мекунад, ки унсурҳоро дар шакли навбат нигоҳ медорад, ки аз рӯи қоидаи FIFO - Аввалин Дар Аввал баромад . Интерфейс дорои татбиқи стандартии зерин аст: LinkedList (бале, он Queue-ро низ амалӣ мекунад) ва PriotityQueue .
Зинанизоми дуюми маҷмӯаҳо Map аст , ки сохтори зерин дорад: Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 9-4Дар ин маҷмӯа тақсимот ба зермаҷмӯаҳо вуҷуд надорад (зеро худи иерархияи Харита чизе монанди зермаҷмӯа аст, аммо дар алоҳидагӣ ҷойгир аст). Амалисозии Харитаи стандартӣ Hashtable (кӯҳнашуда ҳисобида мешавад), LinkedHashMap ва TreeMap мебошанд . Дар асл, вақте ки дар бораи Коллексия пурсида мешавад , одатан ҳарду иерархияро дар назар доранд. Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 9-5

86. Сохтори дохorи ArrayList чист?

ArrayList ба массив монанд аст, аммо бо қобorяти васеъ кардани динамикӣ. Ин чӣ маъно дорад? Гап дар он аст, ки ArrayList дар асоси массиви муқаррарӣ кор мекунад, яъне он элементҳоро дар массиви дохилӣ нигоҳ медорад (андозаи пешфарзаш 10 ячейка аст). Вақте ки массиви дохилӣ пур мешавад, массиви нав сохта мешавад, ки андозаи он бо формулаи зерин муайян карда мешавад:
<размерТекущегоМассива> * 3 / 2  + 1
Яъне, агар андозаи массиви мо 10 бошад, андозаи массиви нав чунин хоҳад буд: 10 * 3 / 2 + 1 = 16. Баъдан, ҳамаи арзишҳо аз массиви якум (кӯҳна) бо истифода аз массив ба он нусхабардорӣ карда мешаванд. усули аслии System.arraycopy () ва массиви аввал нест карда мешавад. Дар асл, ҳамин тавр васеъшавии динамикии ArrayList амалӣ карда мешавад . Биёед усулҳои аз ҳама бештар истифодашавандаи ArrayList-ро дида бароем : 1. add(<Элемент>) - элементро ба охири массив (ба ячейкаи холии охирин) илова мекунад ва аввал тафтиш мекунад, ки дар ин массив ҷой ҷой мавҷуд аст ё на. Агар он вуҷуд надошта бошад, массиви наве сохта мешавад, ки ба он элементҳо нусхабардорӣ карда мешаванд. Мушкorи логарифмикии ин амал O(1) аст. Усули шабеҳ вуҷуд дорад - add(<Индекс>,<Элемент>) . Он элементро на ба охири рӯйхат (массив), балки ба ячейкаи мушаххас бо индекс, ки ҳамчун аргумент омадааст, илова мекунад. Дар ин ҳолат, мураккабии логарифмикӣ вобаста аз он, ки он илова карда мешавад, фарқ мекунад:
  • агар ин тахминан ибтидои рӯйхат бошад, мураккабии логарифмикӣ ба O(N) наздик мешавад, зеро ҳамаи элементҳои дар тарафи рости нав ҷойгиршуда бояд як чашмак ба тарафи рост кӯчонида шаванд;
  • агар элемент дар мобайн гузошта шавад - O(N/2) зеро мо бояд танҳо нисфи унсурҳои рӯйхатро як чашмак ба тарафи рост гузаронем.
Яъне мураккабии логарифмикии ин усул вобаста аз он, ки элемент дар куҷо гузошта шудааст, аз O(N) то O(1) фарқ мекунад. 2. set(<Индекс>,<Элемент>) - элементро ба мавқеъи муайяншуда дар рӯйхат менависад. Агар дар ин мавқеъ аллакай як элемент мавҷуд бошад, онро аз нав менависад. Мушкorи логарифмикии ин амал O(1) аст, зеро дар он ҷо ягон тағирот вуҷуд надорад: танҳо ҷустуҷӯ аз рӯи индекс дар массив, ки он тавре ки мо дар ёд дорем, мураккабии О(1) дорад ва навиштани элемент. 3. хориҷ кардан(<индекс>) - хориҷ кардани элемент аз рӯи индекси он дар массиви дохилӣ. Ҳангоми нест кардани ашёе, ки дар охири рӯйхат нест, шумо бояд ҳамаи ҷузъҳоро ба тарафи рости он як чашмак ба чап кӯчонед, то холигии пас аз нест кардани ҷузъ боқимондаро пӯшонед. Аз ин рӯ, мураккабии логарифмикӣ бо илова (<Индекс>,<Элемент>) хоҳад буд , агар элемент дар мобайн бошад - O(N/2) - зеро ба шумо лозим аст, ки нисфи элементҳоро як ба чап гузаронед. Мувофиқи он, агар он дар ибтидо буд - O(N). Хуб, агар дар охири он O(1) бошад, ҳеҷ чиз ҳаракат кардан лозим нест. Барои онҳое, ки мехоҳанд ба ин мавзӯъ амиқтар омӯзанд, ман ин пайвандро ба мақолае бо таҳлor синфи ArrayList мегузорам . Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 9-6

87. Сохтори дохorи LinkedList чист?

Агар ArrayList элементҳоро дар массиви дохилӣ дошта бошад, пас LinkedList дар шакли рӯйхати дукарата алоқаманд аст. Ин маънои онро дорад, ки ҳар як элемент дорои истинод ба унсури қаблӣ ( гузашта ) ва дигараш ( оянда ). Элементи якум ба унсури қаблӣ пайванде надорад (он аввалин аст), аммо он сарвари рӯйхат ҳисобида мешавад ва LinkedList мустақиман ба он пайванд дорад. Унсури охирин, воқеан, унсури навбатӣ надорад, он думи рӯйхат аст ва бинобар ин дар худи LinkedList ба он пайванди мустақим мавҷуд аст . Аз ин рӯ, мураккабии логарифмикии дастрасӣ ба сар ё думи рӯйхат O(1) аст. Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 9-7Дар ArrayList, вақте ки рӯйхат калон шуд, массиви дохилӣ зиёд шуд, аммо дар ин ҷо ҳама чиз осонтар мешавад - ҳангоми илова кардани элемент, якчанд истинодҳо танҳо иваз мешаванд. Биёед ба баъзе аз усулҳои бештар истифодашавандаи LinkedlList назар андозем : 1. add(<Elelement>) - илова кардан дар охири рӯйхат, яъне. пас аз элементи охирин (5) пайванд ба унсури нав ҳамчун навбатӣ илова карда мешавад . Унсури нав ҳамчун унсури қаблӣ ба охирин (5) пайванд хоҳад дошт . Мушкorи логарифмии чунин амалиёт O(1) хоҳад буд, зеро танҳо пайванд ба унсури охирин лозим аст ва тавре ки шумо дар ёд доред, дум пайванди мустақим аз LinkedList дорад ва мураккабии логарифмикии дастрасӣ ба он ҳадди ақалл аст. 2. илова кардан(<Индекс>,<Элемент>) - илова кардани элемент аз рӯи индекс. Ҳангоми илова кардани элемент, масалан, ба мобайни рӯйхат, аввал элементҳои сар ва дум (дар ҳарду тараф) то пайдо шудани ҷои дилхоҳ такрор карда мешаванд. Агар мо хохем, ки элементеро дар байни сеюм ва чорум дохил кунем (дар расми боло), пас хангоми чустучуи чои дуруст, пайванди навбатии элементи сеюм аллакай ба наваш ишора мекунад. Барои нав, истиноди қаблӣ ба сеюм ишора мекунад. Мутаносибан, пайванди унсури чорум - қаблӣ - аллакай ба унсури нав ишора мекунад ва пайванди навбатии элементи нав ба унсури чорум ишора мекунад: Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 9-8Мушкorи логарифмикии ин усул аз индекси ба элементи нав додашуда вобаста аст:
  • агар он ба сар ё дум наздик бошад, ба O(1) наздик мешавад, зеро дар асл такрор кардани элементҳо лозим нест;
  • агар он ба мобайн наздик бошад, пас О(N/2) - то пайдо шудани элементи зарурӣ элементҳои сар ва дум ҳамзамон ба навъҳо ҷудо карда мешаванд.
3. set(<Индекс>,<Элемент>) - элементро ба мавқеъи муайяншуда дар рӯйхат менависад. Мушкorи логарифмикии ин амалиёт аз O(1) то O(N/2), боз вобаста ба то чӣ андоза наздик будани элемент ба сар, дум ё миёна хоҳад буд. 4. хориҷ кардан(<индекс>) - элементеро аз рӯйхат хориҷ мекунад, аслан ба унсуре, ки пеш аз хориҷшаванда меояд ( гузашта ) ба унсуре, ки пас аз хориҷшаванда меояд ( оянда ) ишора мекунад. Ва баръакс: ба тавре ки унсуре, ки пас аз нестшаванда меояд, ба унсуре, ки пеш аз нестшаванда меояд, ишора мекунад: Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 9-9Натиҷа равандест, ки ба илова кардан аз рӯи индекс ( add(<Индекс>,<Элемент>) ). Барои онҳое, ки мехоҳанд дар бораи сохтори дохorи LinkedList маълумоти бештар гиранд , ман тавсия медиҳам, ки ин мақоларо хонед .

88. Сохтори дохorи HashMap чист?

Шояд яке аз саволҳои маъмултарин ҳангоми мусоҳиба бо таҳиягари Java бошад. HashMap v бо ҷуфтҳои калид-арзиш кор мекунад . Чӣ тавр онҳо дар дохor худи HashMapv нигоҳ дошта мешаванд ? Дар дохor HashMap як қатор гиреҳҳо мавҷуданд:
Node<K,V>[] table
Бо нобаёнӣ, андозаи массив 16 аст ва ҳар дафъа ҳангоми пур кардани он бо элементҳо ду баробар меафзояд (вақте ки ба LOAD_FACTOR расид - фоизи муайяни пуррагӣ, ба таври нобаёнӣ он 0,75 аст ). Ҳар як гиреҳ хэши калид, калид, арзиш ва истинод ба унсури ояндаро нигоҳ медорад: Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 9 — 10Дар асл, "пайванд ба унсури навбатӣ" маънои онро дорад, ки мо бо як рӯйхати ягонаи алоқаманд кор мекунем, ки дар он ҳар як элемент истинод ба оянда. Яъне, HashMap маълумотро дар як қатор рӯйхатҳои ба ҳам алоқаманд нигоҳ медорад. Аммо ман дарҳол қайд мекунам: вақте ки як ячейкаи массиви ҷадвал ба рӯйхати якхела алоқаманде дорад, ки аз зиёда аз як элемент иборат аст, ин хуб нест. Ин падида бархӯрд номида мешавад . Аммо чизҳои аввал. Биёед бубинем, ки чӣ тавр ҷуфти нав бо истифода аз усули put захира карда мешавад . Аввалан, hachCode()- и калид гирифта мешавад. Аз ин рӯ, барои дуруст кор кардани hasshmap , шумо бояд дарсҳое гиред, ки дар онҳо ин усул ҳамчун калидҳо бекор карда шудааст. Пас аз ин рамзи hash дар усули дохилӣ - hash() - барои муайян кардани рақам дар доираи андозаи массиви ҷадвал истифода мешавад . Баъдан, бо истифода аз рақами гирифташуда ба чашмаки мушаххаси массиви ҷадвал дастрасӣ пайдо мешавад . Дар ин ҷо мо ду ҳолат дорем:
  1. Чашмак холӣ аст - арзиши нави гиреҳ дар он нигоҳ дошта мешавад .
  2. Ячейка холӣ нест - арзиши калидҳо муқоиса карда мешавад. Агар онҳо баробар бошанд, арзиши Node нав ба болоии кӯҳна менависад, агар онҳо баробар набошанд, ба элементи навбатӣ дастрасӣ пайдо карда, бо калиди он муқоиса карда мешавад... Ва ҳамин тавр то он даме, ки арзиши нав ягон чизи кӯҳнаро бар навнависад ё ба охири Рӯйхати ягона алоқаманд аст ва он ҷо ҳамчун унсури охирин нигоҳ дошта мешавад.
Ҳангоми ҷустуҷӯи элемент аз рӯи калид ( методи get(<key>) ), hashCode -и калид ҳисоб карда мешавад, сипас арзиши он дар массив бо истифода аз hash() ва бо истифода аз рақами натиҷа, ячейкаи массиви ҷадвал пайдо мешавад. , ки дар он ҷустуҷӯ аллакай тавассути номбар кардани гиреҳҳо ва муқоисаи калиди гиреҳи дилхоҳ бо калиди ҷорӣ анҷом дода мешавад. Амалиётҳо дар Map, дар вазъияти идеалӣ, мураккабии алгоритмии O(1) доранд, зеро онҳо ба массив дастрасӣ доранд ва тавре дар ёд доред, новобаста аз шумораи элементҳо, амалиётҳо дар массив мураккабии O(1) доранд. . Аммо ин идеал аст. Вақте ки ячейкаи массиви истифодашаванда холӣ нест (2) ва дар он ҷо аллакай баъзе гиреҳҳо мавҷуданд, мураккабии алгоритмӣ ба O(N)-и хаттӣ мубаддал мешавад, зеро ҳоло пеш аз ёфтани ҷои дуруст элементҳоро такрор кардан лозим аст. Ман наметавонам инро ёдовар шавам: аз Java 8 сар карда, агар гиреҳи рӯйхате, ки ба ҳам пайвастшуда зиёда аз 8 элемент (бархӯрд) дошта бошад, он ба дарахти бинарӣ табдил меёбад. Дар ин ҳолат, мураккабии алгоритмӣ дигар на O(N), балки O(log(N)) хоҳад буд - ин масъалаи дигар аст, ҳамин тавр не? Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 9 — 11HashMap як мавзӯи бузург аст ва одамон дар мусоҳибаҳо дар бораи он саволҳо додан мехоҳанд. Аз ин рӯ, ман ба шумо маслиҳат медиҳам, ки онро ба таври муфассал фаҳмед (то он ки он аз дандонатон афтад). Шахсан, ман бидуни саволҳои HashMap мусоҳиба накардаам . Шумо метавонед дар ин мақола ба HashMap ғарқ шавед . Ин ҳама барои имрӯз аст, идома дорад... Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 9 — 12
Дигар маводҳо дар силсила:
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION