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. Munuň ý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)
-
Добавление нового element без указания индекса How местоположения будет происходить автоматически в конец обоих списков. В LinkedList новый элемент станет новым хвостом (происходит только перезаписывание пары ссылок — алгоритмическая сложность O(1)).
В ArrayList будет добавлен новый элемент в последнюю пустую ячейку массива — O(1).
-
Добавление element по индексу How правило подразумевает вставку примерно в середину списка. В LinkedList сперва будет вестись поиск нужного места с помощью перебора элементов с “хвоста” и “головы” — O(n/2), а после — вставка значения путем переопределения ссылок элементов, между которыми вставляется новый — O(1). Суммарная алгоритмическая сложность данного действия будет O(n/2).
ArrayList в данной ситуации по индексу находит элемент — O(1), и все элементы справа (включая элемент, который уже хранится по данному индексу) двигаются на одну единицу вправо (при этом возможно понадобится создание нового списка и копирование элементов в него) — O(n/2). Суммарная сложность — O(n/2). -
Добавление element в начало списка в LinkedList будет ситуация схожая с добавлением в конец: новый элемент станет новой “головой” — O(1), в то же время когда ArrayList-у нужно будет двигать все элементы вправо — O(n).
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?
Dogrusy, 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üminde 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.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.
GO TO FULL VERSION