JavaRush /Java Blog /Random-TK /Java dörediji üçin geçirilen söhbetdeşliklerden soraglary...

Java dörediji üçin geçirilen söhbetdeşliklerden soraglaryň we jogaplaryň derňewi. 10-njy bölüm

Toparda çap edildi
Salam! Bir zada ussat bolmak üçin näçe sagat gerek? Men köplenç: "Islendik zada ussat bolmak üçin 10 000 sagat sarp etmeli" ýaly bir zady eşitdim. Gorkunç san, şeýlemi? Java dörediji üçin geçirilen söhbetdeşliklerden soraglaryň we jogaplaryň derňewi.  10-njy bölümŞeýle-de bolsa, bu hakykatmy? Hemişe programmirleme sungatyny özleşdirmek üçin näçe sagat sarp edendigimi anyklamaga çalyşýaryn. Şol söýgüli 10,000 sagatdan geçip, ussat bolanymda, bu tapawudy duýarynmy? Ora-da eýýäm duýman, eýýäm olaryň üstünden bardymmy? Programmist bolmak üçin bir ýa-da başga bir ýol, beýle köp wagt sarp etmegiň zerurlygy ýok. Esasy zat, ony akylly ulanmak. Esasy maksadyňyz, söhbetdeşlikden geçmek. Täze gelenler üçin geçirilen söhbetdeşliklerde ilki bilen soraýan zady teoriýa, şonuň üçin siz bu meselede güýçli bolmaly. Aslynda, söhbetdeşlige taýýarlananyňyzda, siziň wezipäňiz Java döredijiniň esasy teoriýasyndaky ähli boşluklaryňyzy ýüze çykarmak we olary bilim bilen örtmekdir. Bu gün bolsa bu meselede size kömek ederin, sebäbi iň meşhur soraglary derňemegi dowam etdirmek üçin geldim. Geliň, dowam edeliň!

89. “ArrayList” “LinkedList” -den nähili tapawutlanýar?

Bu, “HashMap” -yň içki gurluşy baradaky sorag bilen birlikde iň meşhur soraglaryň biridir . Sensiz ýekeje-de söhbetdeşlik gutarnykly däl, şonuň üçinem oňa jogap “dişleriňizi dişlemeli”. Görnükli - dürli atlardan başga-da, içki gurluşy boýunça tapawutlanýar. Ozal ArrayList we LinkedList- iň içerki gurluşyny gözden geçirdik , şonuň üçin olaryň durmuşa geçirilişiniň jikme-jikliklerine girmerin. “ArrayList” -iň içerki massiw esasynda ýerine ýetirilýändigini ýatladýaryn , formula laýyklykda zerurlyk artýar:
<размерТекущегоМассива> * 3 / 2  + 1
Şol bir wagtyň özünde, LinkedList içerki goşa baglanyşyk sanawyna esaslanýar, ýagny sanawyň başlangyjy / soňy bolan bahalary hasaba almazdan, her elementiň öňki we indiki baglanyşygy bar. Adamlar bu soragy formatda bermegi halaýarlar: “Haýsy has gowusy - ArrayList ýa-da LinkedList ?” Galyberse-de, olaryň birine jogap hökmünde görkezseň, ýalňyş jogap bolar. Java dörediji üçin geçirilen söhbetdeşliklerden soraglaryň we jogaplaryň derňewi.  10-njy bölümMunuň ýerine, haýsy anyk ýagdaý hakda gürleşýändigiňizi anyklamaly - indekslere girmek ýa-da sanawyň ortasyna girizmek. Jogaba baglylykda, öz islegiňizi düşündirip bilersiňiz. ArrayList we LinkedList-iň bir ýa-da başga bir ýagdaýda nähili işleýändigini öňem düşündiripdim . Deňeşdirmek üçin şol bir sahypada goýup, jemläliň: Bir element goşmak (goşmak)
  1. Добавление нового element без указания индекса How местоположения будет происходить автоматически в конец обоих списков. В LinkedList новый элемент станет новым хвостом (происходит только перезаписывание пары ссылок — алгоритмическая сложность O(1)).

    В ArrayList будет добавлен новый элемент в последнюю пустую ячейку массива — O(1).

  2. Добавление element по индексу How правило подразумевает вставку примерно в середину списка. В LinkedList сперва будет вестись поиск нужного места с помощью перебора элементов с “хвоста” и “головы” — O(n/2), а после — вставка значения путем переопределения ссылок элементов, между которыми вставляется новый — O(1). Суммарная алгоритмическая сложность данного действия будет O(n/2).

    ArrayList в данной ситуации по индексу находит элемент — O(1), и все элементы справа (включая элемент, который уже хранится по данному индексу) двигаются на одну единицу вправо (при этом возможно понадобится создание нового списка и копирование элементов в него) — O(n/2). Суммарная сложность — O(n/2).

  3. Добавление element в начало списка в LinkedList будет ситуация схожая с добавлением в конец: новый элемент станет новой “головой” — O(1), в то же время когда ArrayList-у нужно будет двигать все элементы вправо — O(n).

Aşakdaky hatar: LinkedList -de algoritmiki çylşyrymlylyk O (1) -den O (n / 2) aralygynda bolar . .Agny, girizmek sanawyň soňuna ýa-da başyna näçe ýakyn bolsa, şonça-da çalt bolýar. Şol bir wagtyň özünde, ArrayList üçin O (1) -den O (n) aralygynda üýtgeýär : girizmek sanawyň soňuna näçe ýakyn bolsa, şonça-da çalt bolýar. Bir elementi düzmek (düzmek) Bu amal, sanawdaky görkezilen ýere bir element ýazýar, eger bar bolsa, öňki ýazgyny ýazýar. LinkedList -de bu amal goşmak bilen meňzeş bolar, sebäbi Bu ýerde iň uly kynçylyk elementi tapmakdyr. Bir elementi täzeden ýazmak jübüt baglanyşyklary täzeden ýazmak arkaly amala aşyrylar, şonuň üçin bu ýerde hem algoritmiki çylşyrymlylyk sanawyň ahyryndan ýa-da başyndaky pozisiýanyň uzaklygyna baglylykda O (1) -den O (n / 2) aralygynda bolar. Şol wagt bu görkeziji amal üçin ArrayList -de zerur öýjük tapylar we oňa täze element ýazylar. Indeks gözlegi, bu amal ýaly, O (1) algoritmiki çylşyrymlylygyna eýe . Bir elementi indeks boýunça alyň (alyň) LinkedList- de element almak , beýleki amallary gözlemek ýaly prinsip boýunça - ahyryndan ýa-da başyndan uzaklyga baglylykda ýüze çykar. O (1) -den O (n / 2) -e çenli . ArrayList -de , öň hem aýdyşym ýaly, indeks boýunça bir massiwde element gözlemek O (1) çylşyrymlylygyna eýe . “LinkedList” üçin bir elementi aýyryň (aýyryň) “ LinkedList” üçin onuň işleýiş ýörelgesi hem şu ýerde işleýär: ilki element tapylýar, soň bolsa baglanyşyklar gaýtadan ýazylýar - elementiň goňşulary bu elemente salgylanmalaryny ýitirip, biri-birine ýüzlenip başlaýarlar. soň hapa ýygnaýjy tarapyndan ýok ediler. .Agny, algoritmiki çylşyrymlylyk henizem üýtgewsiz - O (1) -den O (n / 2) -e çenli . “ArrayList” üçin bu amal täze element goşmak (goşmak) işine has meňzeýär. Ilki bilen zerur element tapylýar - O (1) , soň bolsa aýrylýar we ýüze çykan boşlugy ýapmak üçin onuň sag tarapyndaky ähli elementler çepe geçirilýär. Öçürmek amaly goşmak amaly bilen birmeňzeş algoritmiki çylşyrymlylyga eýe bolar - O (1) -den O (n) çenli . Öçürmek sanawyň soňuna näçe ýakyn bolsa, şonça-da algoritmiki çylşyrymlylyk az bolar. Aslynda bularyň hemmesi esasy amallardy. Youatladýaryn: bu iki sanawy deňeşdireniňde, haýsy anyk ýagdaý hakda gürleşýändigimizi anyklamaly, soň berlen soraga biragyzdan jogap berip bilersiňiz.

90. “ArrayList” “HashSet” -den nähili tapawutlanýar?

“ArrayList” we “LinkedList” -leri amallar bilen deňeşdirip boljak bolsa - has gowusy - “ArrayList” -i “HashSet” bilen deňeşdirmek beýle aňsat däl , sebäbi bular düýbünden başga kolleksiýalar. Bir süýji tagamy beýlekisi bilen deňeşdirip bilersiňiz, ýöne etli tagam bilen peýda bolar - olar gaty üýtgeşik. Şeýle-de bolsa, olaryň arasynda käbir tapawutlary bermäge synanyşaryn:
  • ArrayList sanaw interfeýsini , HashSet bolsa Set interfeýsini amala aşyrýar ;

  • “ArrayList” -e girmek elementiň görkezijisi bilen mümkindir: almak amalynyň O (1) algoritmiki çylşyrymlylygy bar we HashSet -de zerur elementi diňe zalym güýç bilen alyp bolýar we bu O (1) -den O (n) çenli ;

  • “ArrayList” elementleri köpeltmäge mümkinçilik berýär. “HashSet” -de ähli elementler üýtgeşikdir: ýygyndyda eýýäm bar bolan “HashSet” -e bir element goşmak işlemez (dublikatlar hashcode arkaly barlanýar, şonuň üçin bu kolleksiýanyň ady);

  • ArrayList içerki massiw arkaly, HashSet bolsa içerki HashMap ulanyp amala aşyrylýar ;

  • “ArrayList” elementleriň goýmak tertibini saklaýar, “HashSet” bolsa tertipsiz toplum we elementleriň tertibini saklamaýar;

  • “ArrayList” islendik boş bahalara (null) rugsat berýär, “ HashSet” -e diňe bir null bahany girizip bolýar (ahyrsoňy elementleriň özboluşlylygy).

91. Näme üçin Java-da şeýle dürli dinamiki massiw amallary bar?

Java dörediji üçin geçirilen söhbetdeşliklerden soraglaryň we jogaplaryň derňewi.  10-njy bölümDogrusy, bu has filosofiki sorag. Onda näme üçin köp dürli täze tehnologiýalary oýlap tapýarlar? Rahatlyk üçin. Aslynda, köp sanly dinamiki massiw ýerine ýetirişleri bilen deňdir. Olaryň hiç birini iň gowusy ýa-da ideal diýip atlandyryp bolmaz. Her haýsynyň belli bir ýagdaýda artykmaçlygy bar. Biziň wezipämiz olaryň tapawudyny, güýçli / gowşak taraplaryny bilmek: iň amatlysyny dogry ýagdaýda ulanyp bilmek üçin.

92. Näme üçin Java-da açar gymmaty saklamagyň şeýle dürli görnüşleri bar?

Bu ýerde ýagdaý dinamiki massiw ýerine ýetirişleri bilen deňdir. Iň gowusy ýok: hersiniň güýçli we gowşak taraplary bar. Elbetde, güýçli taraplarymyzdan has köp peýdalanmalydyrys. Mysal: köp sapakly tehnologiýalary öz içine alýan yzygiderli bukjanyň öz “Concurrent” kolleksiýalary bar. Şol bir “ConcurrentHashMap”, adaty “HashMap” bilen deňeşdirilende maglumatlar bilen köp sapakly işleriň howpsuzlygynda artykmaçlyga eýedir , ýöne köp sapakly däl gurşawda tizligini ýitirýär. Dogrusy, islendik ýagdaýda iň güýçli bolmadyk durmuşa geçirişler kem-kemden ulanylmagyny bes edýär. Mysal: Hashtable ilkibaşda ygtybarly HashMap bolmagy maksat edinýärdi , ýöne “ConcurrentHashMap” köp sapakly gurşawda öňe geçdi we “Hashtable” ahyrsoňy ýatdan çykaryldy we indi ulanylmady.

93. Elementleriň ýygyndysyny nädip tertipleşdirmeli?

Ilki bilen aýdyljak zat, ýygnamak elementi synpy Deňeşdirilýän interfeýsi we deňeşdirme usulyny durmuşa geçirmeli . Ora-da deňeşdiriji usuly bilen “Comaprator” -y ýerine ýetirýän synp gerek . Olar hakda has giňişleýin maglumaty şu ýazgyda okap bilersiňiz . Iki usul hem belli bir görnüşdäki obýektleri nädip deňeşdirmelidigini kesgitleýär. Saýlanylanda bu gaty möhümdir, sebäbi elementleri deňeşdirip boljak ýörelgä düşünmeli. Muny etmegiň esasy usuly, tertiplemek isleýän synpyňyzda gönüden-göni ýerine ýetirilen Deňeşdirmäni durmuşa geçirmekdir. Şol bir wagtyň özünde Deňeşdirijiniň ulanylyşy az bolýar. Käbir kitaphanadan deňeşdirip boljak ýerine ýetiriş synpyny ulanýarsyňyz diýeliň , ýöne birneme tertipleşdirmeli bolarsyňyz. Bu synpyň koduny üýtgedip bilmän (uzaltmakdan başga), deňeşdirijiniň ýerine ýetirişini ýazyp bilersiňiz , onda bu synpyň obýektlerini haýsy prinsip bilen deňeşdirmek isleýändigiňizi görkezýärsiňiz. Moreene bir mysal. Bir görnüşdäki obýektleri tertiplemek üçin size dürli ýörelgeler gerek diýeliň, şonuň üçin dürli ýagdaýlarda ulanýan birnäçe Deňeşdiriji ýazýarsyňyz. Düzgün bolşy ýaly, gutudan köp synplar eýýäm Deňeşdirilýän interfeýsi - şol bir setiri durmuşa geçirýärler . Aslynda, olary ulananyňyzda, olary nädip deňeşdirmelidigi barada alada etmeli däl. Olary diňe alyp, ulanýarsyňyz. Ilkinji we düşnükli usul , elementleri synp deňeşdirijisine görä elementleri eýýäm tertipleşdirilen tertipde saklaýan TreeSet ýa-da TreeMap görnüşli ýygyndydan peýdalanmakdyr . TreeMap düwmelerini tertipleşdirýändigini ýadyňyzdan çykarmaň , ýöne baha däl. Deňeşdirmegiň ýerine “Deňeşdiriji” ýerine ýetirişini ulanýan bolsaňyz , döredilenden soň obýektini kolleksiýa konstruktoryna geçirmeli bolarsyňyz:
TreeSet treeSet = new TreeSet(customComparator);
Collectionöne başga görnüşli kolleksiýaňyz bar bolsa näme etmeli? Ony nädip tertipleşdirmeli? Bu ýagdaýda, Kolleksiýalar peýdaly synpynyň ikinji usuly - sort () usuly laýykdyr . Statik, şonuň üçin size diňe synpyň ady we zerur sanawyň berilýän usuly gerek. Mysal üçin:
Collections.sort(someList);
“Deňeşdirme” ulanmaýan bolsaňyz , “Deňeşdiriji” ýerine ýetirýän bolsaňyz, ony ikinji parametr hökmünde geçirmeli:
Collections.sort(someList, customComparator);
Netijede, geçen sanawyň elementleriniň içki tertibi üýtgär: element deňeşdirijisine görä tertiplener. Geçirilen elementleriň sanawynyň üýtgemeli bolmalydygyny, ýagny. üýtgedilip bilner, ýogsam bu usul işlemez we goldanmaýan operasiýaException zyňylar . Üçünji usul hökmünde , Deňeşdirme ýerine ýetirilişi ulanylsa , kolleksiýanyň elementlerini tertipleşdirýän “Akym” sortlaşdyryş amalyny ulanyp bilersiňiz :
someList = someList.stream().sorted().collect(Collectors.toList());
deňeşdiriji bolsa :
someList = someList.stream().sorted(customComparator).collect(Collectors.toList());
Akym hakda has giňişleýin maglumaty şu makalada okap bilersiňiz . Dördünji usul, köpürjik görnüşi ýa-da birleşdirmek görnüşi ýaly sortlamagy el bilen amala aşyrmakdyr .

ClassObject. Deňdir we HashCode

94. Java-da synp obýektiniň gysgaça düşündirişini beriň

Derňewiň ikinji bölüminde, Obýekt synpynyň usullary barada eýýäm gürleşipdik we Obýekt synpynyň Java-daky ähli synplaryň neslidigini ýatladýaryn . Onda degişlilikde ähli synplara miras galan 11 usul bar. 11 usul barada maglumatlary ara alyp maslahatlaşmagyň ikinji bölümindeJava dörediji üçin geçirilen söhbetdeşliklerden soraglaryň we jogaplaryň derňewi.  10 - 4 bölüm tapyp bilersiňiz .

95. Java-da deň we HashCode näme ulanylýar?

hashCode (), ähli synplara miras galan Obýekt synpynyň usulydyr . Onuň wezipesi belli bir obýekti görkezýän san döretmekdir. Bu usuly ulanmagyň mysaly , jübütiň saklanjak içerki massiwiniň (çelekiniň) öýjügini kesgitlän ýerli hashkody has-da kesgitlemek üçin esasy obýektdäki HashMap- da ulanylmagydyr . Derňewiň 9-njy bölüminde “HashMap” -yň işi barada jikme-jik gürleşdik , şonuň üçin bu barada kän pikir etmeris. Mundan başga-da, bu usul obýektleriň şahsyýetini kesgitlemek üçin esasy gurallaryň biri hökmünde deň () usulda ulanylýar. deňdir () Obýekt synpynyň usuly bolup , onuň işi obýektleri deňeşdirmek we olaryň deňdigini ýa-da ýokdugyny kesgitlemekdir. Bu usul obýektleri deňeşdirmeli ýerlerimizde ulanylýar, sebäbi == ulanyp adaty deňeşdirme obýektler üçin amatly däl, sebäbi diňe baglanyşyklary deňeşdirýär. Java dörediji üçin geçirilen söhbetdeşliklerden soraglaryň we jogaplaryň derňewi.  10-5-nji bölüm

96. Java-daky “Equals” we “HashCode” arasyndaky şertnama barada bize aýdyň?

Ilki bilen aýtjak zadym, deň () we hashCode () usullarynyň dogry işlemegi üçin , dogry ýazylmaly. Ondan soň düzgünleri berjaý etmeli:
  • deň mukdarda deňeşdirme arkaly deňeşdirilýän birmeňzeş obýektler birmeňzeş hash kodlaryna eýe bolmalydyr ;
  • birmeňzeş hash kodlary bolan obýektler hemişe deň bolup bilmez.
Bu pursatda derňewiň indiki bölegine çenli durarys!Java dörediji üçin geçirilen söhbetdeşliklerden soraglaryň we jogaplaryň derňewi.  10-6-njy bölüm
Tapgyryň beýleki materiallary:
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION