JavaRush /Java Blogu /Random-AZ /ArrayList sinifinin ətraflı təhlili [1-ci hissə]
Vonorim
Səviyyə

ArrayList sinifinin ətraflı təhlili [1-ci hissə]

Qrupda dərc edilmişdir
Bu məqalədə Collections Framework-dən ArrayList sinfinə ətraflı nəzər salınacaq ki, bu da adi massiv üzərində qurulduğuna görə bəlkə də ən asan başa düşüləndir. Demək olar ki, müsahibə zamanı bu sinif və onun Java-da tətbiqi ilə bağlı sual veriləcək. İkinci hissədə biz qalan metodları təhlil edəcəyik və rəqəmlər üçün dinamik massivin öz tətbiqini yazacağıq. ArrayList sinfi AbstractList sinfindən miras qalır və aşağıdakı interfeysləri həyata keçirir: List, RandomAccess, Cloneable, Serializable. ArrayList sinfinin ətraflı təhlili [2-ci Hissə] ArrayList sinfinin ətraflı təhlili [1-ci hissə] - 1 ArrayList sinfi lazım olduqda genişləndirilə bilən dinamik massivləri dəstəkləyir. Onun zəruriliyi və effektivliyi adi massivin sabit uzunluğa malik olması ilə izah olunur: o yaradıldıqdan sonra nə böyüyə, nə də kiçilə bilər, bu isə massivin nə qədər böyük tələb olunacağı bilinməyəndə məhdudiyyətlər qoyur. Əslində, ArrayList sinfi obyekt istinadlarının dəyişən uzunluqlu siyahı massividir. Elementlər ondan çıxarıldıqda daxili massivin ölçüsünün (xanaların sayı) avtomatik olaraq azalmadığını başa düşmək vacibdir. sizeƏslində, massivdə faktiki mövcud olan elementlərin sayını göstərən dəyişənin dəyəri azalır. Tutaq ki, biz ArrayList sinfinin yeni obyektini yaradaq və ona 5 element əlavə edirik. Varsayılan olaraq, 10 elementdən ibarət massiv yaradılır. Bu halda, obyektimizin sözdə tutumu (ölçüsü/həcmi) 10-a bərabər olacaq, lakin dəyişənin dəyəri sizebeşə bərabər olacaqdır. Elementləri siləndə isə dəyişənin qiymətində dəyişikliklər görürük size, çünki biz .lengthArrayList sinifinin daxili massivinə daxil olub onun uzunluğunu öyrənə bilmirik. Ölçüsü trimToSize()daha sonra müzakirə ediləcək əlavə bir üsulla azaldıla bilər. Gəlin sinif sahələrinə baxaq.
  • Dinamik massivin standart həcminə cavabdeh olan sahə:

    private static final int DEFAULT_CAPACITY = 10

    Yeni obyekt yaratarkən yeni ArrayList<>() (parametrsiz konstruktor) daxilində 10 elementdən ibarət massiv yaradılır.

  • Kolleksiyanın bütün elementlərinin saxlandığı sahə:

    transient Object[] elementData

    Açar sözlə qeyd olunur transient- standart seriallaşdırma alqoritmindən istifadə edərkən sahə bayt axınına yazılmır. Qeyd etmək lazımdır ki, sahə açar sözlə qeyd olunmayıb private, lakin bu, iç içə siniflərdən (məsələn, SubList) bu sahəyə girişi asanlaşdırmaq üçün edilib.

  • Massivdə faktiki olaraq elementlərin sayını saxlayan sayğac sahəsi:

    private int size

    Daxiletmə və silmə kimi əməliyyatlar yerinə yetirilərkən dəyər artırılır/azaldılır.

Sinifdə daha 3 sahə var, lakin mahiyyətcə bunlar əlavədir, ona görə də onları nəzərdən keçirməyin mənası yoxdur. Sinfin üç konstruktoru var:
  1. public ArrayList()– 10 elementdən ibarət boş siyahı massivi yaradır;
  2. public ArrayList(Collection < ? extends E > c)– keçmiş kolleksiyanın elementləri ilə inisiallaşdırılmış siyahı massivi yaradır (bəzi kolleksiya əsasında yeni ArrayList yaratmaq istəsək);
  3. public ArrayList(int initialCapacity)– ilkin tutumlu siyahı massivi yaradır. Keçirilmiş initialCapacity parametri 0-dan böyükdürsə, o zaman göstərilən ölçülü massiv yaradılır (daxili elementData sahəsinə initialCapacity ölçüsündə Obyekt tipli yeni massiv üçün keçid təyin edilir). Parametr 0 olarsa, boş massiv yaradılır. Göstərilən parametr 0-dan azdırsa, o zaman IllegalArgumentException atılır.
Obyektin yaradılması
List < String> list = new ArrayList<>();
Yeni yaradılmış obyekt listxassələri (sahələr) elementDatasize. Dəyər anbarı, bizim vəziyyətimizdə elementDataxüsusi tipli (ümumi - ilə göstərilmişdir) massivdən başqa bir şey deyildir . Parametrləri olmayan konstruktor çağırılırsa, o zaman defolt olaraq Obyekt tipli 10 elementdən ibarət massiv yaradılacaq (əlbəttə ki, tipə keçid ilə). Elementlərin əlavə edilməsi Klassik olaraq siyahı massivinə elementlərin əlavə edilməsi . <>String[]ArrayList sinfinin ətraflı təhlili [1-ci hissə] - 2add()
public boolean add(E элемент)
Yaxşı, əlavə edək: list.add("0"); ArrayList sinfinin ətraflı təhlili [1-ci hissə] - 3Bu metodun daxilində metodun həddən artıq yüklənmiş versiyası çağırılır add(), kimi işarələnir privatevə bu da öz növbəsində giriş kimi üç parametr alır: əlavə olunacaq element, daxili massiv və onun ölçüsü. Şəxsi metodda yoxlama baş verir: əgər ötürülən ölçü parametri daxili massivin uzunluğuna bərabərdirsə (yəni massiv doludur), onda massivə metodun nəticəsi grow(int minCapacity)(sahənin cari dəyəri) təyin edilir. ölçüsü + 1 metoda ötürülür, çünki əlavə olunan elementi nəzərə almaq lazımdır), burada daxili seriala orijinal massivin elementlərini kopyalamaqla əldə edilən yeni yaradılmış massivə keçid verilir:
Arrays.copyOf(elementData, newCapacity(minCapacity))
Metodun ikinci parametri olaraq, yeni massiv ölçüsünün hesablandığı copyOfmetodun nəticəsini göstəririk . newCapacity(int minCapacity)Aşağıdakı düsturla hesablanır: int newCapacity = oldCapacity + (oldCapacity >> 1) Defolt ölçüsü olan massiv üçün aşağıdakılar doğru olacaq: >> 1– bit istiqamətində bir sağa sürüşdürün (rəqəmi onun yarısına endirən operator). Əslində bu, 1-in gücünə 2-yə bölmək deməkdir. Belə çıxır ki, 10-u 2-yə bölüb 10 əlavə edirik. Ümumilikdə massivin yeni tutumu 15-dir, lakin 11-ci elementi əlavə etdiyimiz üçün 15 + 1 olur. = 16. Siyahımıza qayıdaq və tutaq ki, biz artıq ona 10 element əlavə etmişik və 11 elementi əlavə etməyə çalışaq. Yoxlama massivdə boş yer olmadığını göstərəcək. Arrays.copyOfMüvafiq olaraq, daxili olaraq sistem metodundan istifadə edən yeni bir massiv yaradılır və çağırılır System.arraycopy(). ArrayList sinfinin ətraflı təhlili [1-ci hissə] - 4ArrayList sinfinin ətraflı təhlili [1-ci hissə] - 5Və ya JavaRush-dakı bir məqalədən aydın bir nümunə: ArrayList sinfinin ətraflı təhlili [1-ci hissə] - 6Bütün bu yoxlamalardan sonra və zərurət yarandıqda massivin ölçüsünü artırdıqdan sonra şəxsi metodda add()massivin sonuna yeni element əlavə olunur və cari parametr sizebir dəfə artırılır. . Köhnə massiv sonradan zibil kollektoru tərəfindən emal ediləcək. Dinamik massiv belə işləyir: biz elementlər əlavə etdikdə, orada hələ də yerin olub-olmadığını yoxlayırıq. Boşluq varsa, sadəcə olaraq elementi massivin sonuna əlavə edirik. Son massivdəki sonuncu xana deyil, dəyərinə uyğun gələn xana deməkdir size. Birinci elementi massivə əlavə etdik, o, [0] indeksli xanaya yerləşdirilir. Sahənin qiyməti sizebir artdı və = 1. Növbəti elementi əlavə edirik: görürük ki size = 1, müvafiq olaraq elementi [1] indeksli xanaya yerləşdiririk və s. Metodun iki parametrli həddindən artıq yüklənmiş versiyası var:
public void add(int index, E element)
Elementi əlavə etmək istədiyimiz xananın mövqeyini (indeksini) təyin edə bilərik. Birincisi, göstərilən indeks dəyərinin düzgünlüyü yoxlanılır, çünki heç bir şey olmayan və ya sadəcə mövcud olmayan bir hüceyrəyə işarə edən səhv bir indeksin göstərilmə ehtimalı var. İndekslərin yoxlanılması: index > size || index < 0– əgər göstərilən indeks serialın cari ölçüsündən böyükdürsə və ya 0-dan kiçikdirsə, istisna atılır IndexOutOfBoundsException. Sonra, lazım gələrsə, yuxarıdakı nümunəyə bənzər şəkildə massivin ölçüsü artırılır. Siz yəqin ki, massivdə əlavə/çıxarma əməliyyatları zamanı nəyinsə harasa (ya sağa, ya da sola) yerdəyişdiyini eşitmisiniz. Beləliklə, yerdəyişmə massivin kopyalanması ilə həyata keçirilir: System.arraycopy(elementData, index, elementData, index + 1, s - index); Göstərilən indeksin sağında yerləşən bütün elementlər bir mövqe sağa (indeks+1) sürüşdürüləcək. Və yalnız bundan sonra müəyyən edilmiş indeksdə daxili massivə yeni element əlavə olunur. Massivin bir hissəsini bir sağa köçürdüyümüz üçün (yeni massiv yaradılmayıb), bizə lazım olan xana yazı üçün pulsuz olacaq. Köhnə massivlə əlaqə silinir və gələcəkdə onu zibil kollektoru götürəcək. Artıq işğal olunmuş hücrəyə [3] "maserati" yapışdırın:
ArrayList sinfinin ətraflı təhlili [1-ci hissə] - 7
Beləliklə, indeksə element daxil edildikdə və massivdə boş yerlər olmadıqda, çağırış System.arraycopy()iki dəfə baş verəcək: birincisi in grow(), ikincisi metodun özündə add(index, value), bu da bütün əlavə əməliyyatının sürətinə aydın şəkildə təsir edəcək. Nəticədə, daxili massivə başqa element yazmaq lazım olduqda, lakin orada boşluq olmadıqda, ArrayList daxilində belə olur:
  • Ölçüsü orijinaldan 1,5 dəfə böyük olan yeni massiv, üstəgəl bir element yaradılır.
  • Köhnə massivdəki bütün elementlər yeni massivə kopyalanır
  • Yeni massiv ArrayList obyektinin daxili dəyişənində saxlanılır və köhnə massiv zibil elan edilir.
ArrayList tipli obyektlərin tutumu metoddan istifadə etməklə əl ilə artırıla bilər:
public void ensureCapacity(int minCapacity)
Massiv tutumunu əvvəlcədən artırmaqla, daha sonra RAM-ın əlavə yenidən paylanmasının qarşısını ala bilərsiniz. Metod ötürülən elementlərin sayını yerləşdirmək üçün daxili massivin ölçüsünü artırır minCapacity. Metod ensureCapacity()sahəyə təsir etmir , daxili massivin (ölçüsünə) sizetəsir edir . capacityBir daha vurğulayıram ki, sizehər ikisi capacityfərqli şeylərdir və onları qarışdırmamaq çox vacibdir! ArrayList-in qurulduğu əsas massivin ölçüsünü faktiki saxlanılan elementlərin cari sayına qədər azaltmaq istəyirsinizsə, trimToSize(). Kolleksiyadan elementləri sildikdən sonra size()o, faktiki mövcud elementlərin sayını göstərəcək və capacityazalmayacaq! Tutaq ki: biz 100 element daxil etdik, ilk 50-ni sildik, sizeo, 50-yə bərabər olacaq və beləliklə, capacity100 olaraq qalacaq. və -i azaltmaq üçün bütün tutumumuzu cari ölçüyə uyğunlaşdıran capacitymetoddan istifadə etməliyik . trimToSize()Necə uyğun gəlir? Massivimizi elə kopyalayır ki, boş xana qalmasın (yeni massivin uzunluğu sadəcə ölçü sahəsinə bərabərdir).
ArrayList sinfinin ətraflı təhlili [1-ci hissə] - 8
Siz həmçinin istifadə edərək kolleksiyamıza elementlər əlavə edə bilərsiniz addAll.
public boolean addAll(Collection< ? extends E> c)
public boolean addAll(int index, Collection< ? extends E> collection);
Birinci seçim metodun parametrində göstərilən kolleksiyadan (məsələn, başqa vərəq) bütün elementləri metod çağırışının edildiyi orijinal kolleksiyaya (sonda daxil edin) əlavə etməyə imkan verir. Keçirilmiş kolleksiya (bir çoxluq da ola bilər) istifadə edərək massivə çevrilir toArray(). Təbii ki, əlavə əməliyyatı da surətdən istifadə etməklə həyata keçirilir. İkincisi collection, indeksdən başlayaraq bütün elementləri siyahıya əlavə etməkdir index. Bu halda, bütün elementlər siyahıdakı elementlərin sayına görə sağa sürüşəcək collection. Elementlərin silinməsi Əvvəlcə ArrayList-dən elementləri silmək üçün klassik variantlara baxaq.
public E remove(int index)
İndeks üzrə silməni həyata keçirir və bütün sonrakı elementləri (müəyyən edilmiş indeksdəki elementdən sonra) sola keçirir və bununla da “deşikləri” bağlayır. O, həmçinin silinmədən əvvəl əlavə dəyişənə yazılmış, metod çağırışı nəticəsində dəyərini əldə etdiyimiz silinmiş elementi (E) qaytarır. E-nin nə olduğunu başa düşmək üçün ümumi tiplər deyilənlərlə tanış olmaq lazımdır. E qeydi metodun ArrayList obyektini yaratarkən müəyyən edilmiş məlumat növünü qaytardığını göstərir (unutmayın: List <String> listmüvafiq olaraq bu halda E “əvəzlənəcək” String). Ümumi başa düşmək üçün ümumi növlərlə tanış olmağı tövsiyə edirəm. Daxil edilmiş indeksin düzgünlüyü yoxlanılır və sonra metodun daxilində element tamamilə silinmir, lakin fastRemove(Object[] es, int i)silinmə artıq baş verən özəl metod adlanır. Massivimizi və göstərilən indeksi giriş olaraq metoda ötürürük. Elementlər istifadə edərək kopyalanır System.arraycopy(), massivin ölçüsü azaldılır və sonra sonuncu elementə null təyin edirik. Qeyd etmək lazımdır ki, yeni massiv yaradılmayıb: System.arraycopy(es, i + 1, es, i, size - 1 - i); Göstərilən indeksin (i+1) altındakı mövqenin sağında olan hissə orijinal massivimizə (es) kopyalanır və o, elə mövqedən başlayaraq yerləşir. (i) elementin silinməli olduğu yer. Beləliklə, sola sürüşmə etdik və elementimizi sildik.
ArrayList sinfinin ətraflı təhlili [1-ci hissə] - 9
Gəlin 3-cü indeksdəki elementi aşağıdakı massivdən çıxarmağa çalışaq:
ArrayList sinfinin ətraflı təhlili [1-ci hissə] - 10
Metodun ikinci versiyasını nəzərdən keçirək:
public boolean remove(Object o)
Metod ötürülən elementi siyahıdan o, daha dəqiq desək, göstərilən linkdəki obyekti silir. Siyahıda element varsa, o silinir və bütün elementlər sola sürüşdürülür. Element siyahıda mövcuddursa və uğurla silinibsə, metod doğru, əks halda false qaytarır. İndekslə silinmə variantına bənzər olaraq, üsul fastRemove()eyni hərəkətlərin baş verdiyi yer adlanır. Fərq ondadır ki, metod əlavə olaraq Object sinifinin remove(Object o)metodu vasitəsilə istədiyiniz obyekti axtarır . equals()Dəyərlə silindikdə, uyğunluq tapılana qədər dövrə siyahının bütün elementlərindən keçir. Yalnız tapılan ilk element silinəcək. Xülasə edək: dinamik massivdən elementləri silərkən adi massivdəki kimi boşluq qalmır (silinmiş xana boş olmayacaq). Bütün sonrakı elementlər (indeksin sağında olan) bir mövqe sola sürüşdürülür. Siyahıdan elementləri müxtəlif dərəcədə silmək üçün istifadə edilə bilən bir neçə əlavə üsul var. Onlara qısaca nəzər salaq. Kolleksiyamızın təmizlənməsi:
public void clear()
Sadə bir döngə formassivin bütün elementləri arasında təkrarlanır və hər bir elementə null təyin edir. Siz başqa köçürülmüş kolleksiyada olan elementləri kolleksiyamızdan silə bilərsiniz:
public boolean removeAll(Collection< ?> c)
Bir neçə elementi silmək lazımdırsa, yəqin ki, bunu şərti dövrədə etməməlisiniz: metoddan istifadə etmək daha rahat və təhlükəsizdir removeAll(). Siyahıdan silinəcək elementlər toplusunu qəbul edir. Kolleksiyada hədəf siyahının saxladığı eyni tipli elementlər olmalıdır. Əks halda atılacaq ClassCastException. Metod çağırışı nəticəsində siyahı dəyişdirilibsə, metod doğru qaytaracaq.
ArrayList sinfinin ətraflı təhlili [1-ci hissə] - 11
Keçilmiş kolleksiyaya aid olmayan elementləri silir:
public boolean retainAll(Collection< ?> c)
ArrayList sinfinin ətraflı təhlili [1-ci hissə] - 12
Deyək ki, kolleksiyamız var:
List< String> listFirst = new ArrayList<>();
listFirst.add("White");
listFirst.add("Black");
listFirst.add("Red");
Və ikinci:
List< String> listSecond = new ArrayList<>();
listSecond.add("Green");
listSecond.add("Red");
listSecond.add("White");
Ondan sonra listSecond.retainAll(listFirst)in listSecondqalacaq:

"White"
"Red"
"Yaşıl" silindiyi üçün, bu da listFirst. Ancaq listSecond.removeAll(listFirst)bundan sonra listSecondqalacaq:

"Green"
Удалorсь все элементы, которые есть в listFirst.
Keçilmiş kolleksiyaya aid deyil - o deməkdir ki, əgər keçmiş kolleksiyada olmayan elementlər varsa, onları birincidən (metodun tətbiq olunduğu) çıxarmaq lazımdır. Köçürülmüş kolleksiyaya aid olmaq - müvafiq olaraq, həm birinci, həm də ikinci (köçürülmüş) kolleksiyalarda element varsa, birincidən dublikat məhv edilir.
protected void removeRange(int fromIndex, int toIndex)
Müəyyən edilmiş başlanğıc indeksi (daxil olmaqla) və son göstərilən indeks (daxil deyil) arasında olan bütün elementləri siyahıdan çıxarır. Qeyd etmək lazımdır ki, metod birbaşa ArrayList obyektində çağırıla bilməz. Onu istifadə etmək üçün miras almalısınız AbstractList/ArrayList. Metod başqa bir üsulla da istifadə olunur (subList, daha sonra müzakirə olunacaq).
public boolean removeIf(Predicate< ? super E> filter)
Verilmiş predikata əsaslanan kolleksiyadan elementləri silir. Predikatın özü müəyyən bir funksiya/alqoritm/şərtdir ki, onun əsasında verilmiş şərtə uyğun gələn bir və ya bir neçə element çıxarılacaqdır. Predicate— funksional interfeys (yalnız bir metoddan ibarətdir, ona görə də o, lambda kimi istifadə oluna bilər), “bir parametr alındı ​​– geri qaytarılan boolean” prinsipi ilə işləyir. Əsasən, metod interfeysdən həyata keçirməyə üstünlük verir Collectionvə aşağıdakı "strategiya"nı həyata keçirir: o, elementlər arasında dövrə vurur və bizim Predicate; sonra birinci iterasiyada qeyd olunmuş elementləri silmək (və dəyişdirmək) üçün ikinci dəfə həyata keçirilir. PredicateGəlin iki obyekt bərabər olarsa, həqiqəti qaytaracaq bir interfeys tətbiq edək :
class SamplePredicate< T> implements Predicate< T>{
  T varc1;
  public boolean test(T varc){
     if(varc1.equals(varc)){
       return true;
  }
  return false;
  }
}
StringBaşqa bir sinifdə aşağıdakıları həyata keçirən sinifimizin bir obyektini və ArrayList yaradaq Predicate:
ArrayList< String> color_list = new ArrayList<> ();
SamplePredicate< String> filter = new SamplePredicate<> ();
Dəyişənə varc1"Ağ" dəyərini yazaq:
filter.varc1 = "White";
Siyahıya bir neçə sətir əlavə edək:
color_list.add("White");
color_list.add("Black");
color_list.add("Red");
color_list.add("White");
color_list.add("Yellow");
color_list.add("White");
removeIfObyektimizi şərtlə ötürəcəyimiz siyahıdakı metodu icra edək :
color_list.removeIf(filter);
Nəticədə, "Ağ" dəyəri olan bütün sətirlər siyahıdan silinəcək, çünki "predikatımız" onları bərabərlik üçün müqayisə edir. Yekun siyahı: [Qara, Qırmızı, Sarı].
ArrayList sinfinin ətraflı təhlili [1-ci hissə] - 13
Elementlərin dəyişdirilməsi
public E set(int index, E element)
Müəyyən edilmiş mövqedəki elementi indexkeçmişlə əvəz edir element. İndeks də sıfırdan böyük və sonuncu elementin indeksindən kiçik olmalıdır, əks halda istisna atılacaq IndexOutOfBoundsException. Daxili massivin heç bir nüsxəsi baş vermir. Sadəcə olaraq, göstərilən indeksdəki elementin yerinə yeni element daxil edilir, yəni. dəyərin üzərinə yazın.
ArrayList sinfinin ətraflı təhlili [1-ci hissə] - 14
public void replaceAll(UnaryOperator<e> operator)
Kolleksiyanın bütün elementlərini dəyişir (şərtlə mümkündür). Əsasən lambdalar və ya anonim siniflə birlikdə istifadə olunur (lakin aydınlıq üçün misalda sadəcə interfeysi həyata keçirən sinifdən istifadə edəcəyik) interfeysi həyata keçirən UnaryOperatorvə onun metodlarını müəyyən edir. İnterfeys həyata keçirək:
class MyOperator< T> implements UnaryOperator< T>{
   T varc1;
   public T apply(T varc){
     return varc1;
  }
}
StringBaşqa bir sinifdə aşağıdakıları həyata keçirən sinifimizin bir obyektini və ArrayList yaradaq UnaryOperator:
ArrayList< String> color_list = new ArrayList<> ();
MyOperator< String> operator = new MyOperator<> ();
Dəyişənə varc1"Ağ" dəyərini yazaq:
operator.varc1 = "White";
Siyahıya bir neçə sətir əlavə edək:
color_list.add("White");
color_list.add("Black");
color_list.add("Red");
color_list.add("White");
color_list.add("Yellow");
color_list.add("White");
replaceAllObyektimizi ötürəcəyimiz siyahıda metodu icra edək operator:
color_list.replaceAll(operator);
Nəticədə siyahıdakı bütün dəyərlər "Ağ" ilə əvəz olundu: [Ağ, Ağ, Ağ, Ağ, Ağ, Ağ]. Və beləliklə, məsələn, kolleksiyadakı sətirlərdən bütün boşluqları silə bilərsiniz:
ArrayList< String> list = new ArrayList<>(Arrays.asList("A   ", "  B  ", "C"));
list.replaceAll(String::trim);
Digər üsullar: ArrayList siyahısı massivini metoddan istifadə edərək adi massiləyə çevirə bilərsiniz:
public Object[] toArray()
və ya
public < T> T[] toArray(T[] a)
- burada qaytarılan massivin növü müəyyən edilir runtime Bu üsul imkan verir:
  1. bəzi əməliyyatları sürətləndirmək;
  2. kolleksiyanı birbaşa qəbul etmək üçün çox yüklənməmiş metoda parametr kimi massivi ötürmək;
  3. Yeni kolleksiya əsaslı kodun kolleksiyaları tanımayan köhnə kodla inteqrasiyası.
Massivin surət obyektini qaytarın:
public Object clone()
Nəzərə alın ki, metod clone()Obyekt tipini qaytarır, ona görə də onu çağırdıqdan sonra tələb olunan sinfə köçürməli olacaqsınız. Klonlama yeni müstəqil obyekt yaradır. Kolleksiyada obyektin olub olmadığını yoxlayın:
public boolean contains(Object o)
Siyahıda obyektin olub-olmadığını yoxlayır (daxili olaraq Obyekt sinfinin bərabər metodundan istifadə etməklə, yəni istinadları müqayisə edir), nəticədən asılı olaraq doğru/yanlış qaytarır. Adi döngələrə əlavə olaraq, kolleksiyanı təkrarlaya bilərsiniz (hər bir elementə daxil olmaq, həmçinin bəzi hərəkətləri yerinə yetirmək) istifadə edərək:
public void forEach(Consumer< ? super E> action)
Siyahımızı belə göstərə bilərik:
List< Integer> numbers = new ArrayList<>(Arrays.asList(10, 20, 50, 100, -5));
numbers.forEach((number)-> System.out.println(number));
Lambdalardan istifadə etmədən anonim sinifdən istifadə etməli və acceptinterfeys metodunu ləğv etməlisiniz Consumer:
numbers.forEach(new Consumer< Integer>() {
  @Override
   public void accept(Integer integer) {
      System.out.println(integer);
          }
});
Elementi indeksinə görə əldə edin:
public E get(int index)
Kolleksiya elementlərinə təsadüfi giriş üçün istifadə olunur. Göstərilən indeksdə siyahıda yerləşən elementi qaytarır. Siyahıdakı elementlərin maksimum sayı index < 0və ya olarsa , istisna atılacaq . Bu, siyahıdan elementin götürülməsinin əsas üsuludur və ArrayList-in ölçüsündən asılı olmayaraq, elementi indekslə əldə etmək üçün vaxt həmişə eyni olacaq, çünki o, xüsusi massiv xanasına daxil olur. Müəyyən edilmiş obyektlər üçün indekslərin tapılması: index >=IndexOutOfBoundsException
public int indexOf(Object o);
public int lastIndexOf(Object o);
Metodlar siyahıda birinci (verilmiş obyektlə ilk dəfə qarşılaşdıqda) və ya sonuncu (verilmiş obyektlə sonuncu dəfə qarşılaşdıqda) elementin indeksini qaytarır. Element siyahıda yoxdursa, metodlar -1 qaytaracaq.
ArrayList sinfinin ətraflı təhlili [1-ci hissə] - 16
ArrayList sinfinin ətraflı təhlili [1-ci hissə] - 17
Kolleksiyada elementləri yoxlayın:
public boolean isEmpty();
Metod siyahı boşdursa (sahənin bərabər olub-olmadığını yoxlayır size 0) doğru qaytarır, əks halda yanlışdır. Siyahıda yalnız null elementlər varsa, metod false qaytaracaq. Başqa sözlə, bu üsulla null elementləri də nəzərə alınır. Siyahıdakı elementlərin sayını tapın:
public int size();
Siyahıdakı elementlərin sayını qaytarır (ölçü sahəsinin dəyərləri). Elementlərin sayı siyahı tutumundan (tutumundan) fərqlənə bilər. Siyahı üçün iterator alın:
public Iterator< E> iterator();
Sonradan dövrədə və ya hər hansı digər emalda istifadə etmək üçün siyahı üçün iteratoru qaytarır. İterator uğursuz sürətli davranışı həyata keçirir. Kolleksiyadan keçərsə və onda bəzi dəyişiklikləri (iterator metodlarından istifadə edilməklə əldə olunmadığını) qeyd edərsə, dərhal istisna atır ConcurrentModificationException. İterator adlı bir şey var modification count. İterator hər birindən sonra kolleksiyanı təkrarlayanda next/hasNext/removebu sayğacı yoxlayır. İteratorun görməyi gözlədiyi ilə uyğun gəlmirsə, istisna atır. Burada iteratorları ətraflı nəzərdən keçirməyəcəm.
public ListIterator< E> listIterator() и public ListIterator< E> listIterator(int index)
Daha sonra dövrədə və ya hər hansı digər emalda istifadə etmək üçün siyahı üçün siyahı iteratorunu qaytarır. İnterfeys siyahının ikitərəfli keçidi və onun elementlərinin dəyişdirilməsi üçün ListIteratorinterfeysi genişləndirir . IteratorHəddindən artıq yüklənmiş versiyada "keçmə" nin başlayacağı indeksi keçə bilərsiniz. Bu vəziyyətdə indeks metodun işə başlayacağı ilk elementi ifadə edir next()və metod çağırıldıqda previous()keçid "keçilmiş indeks - 1" indeksinin altındakı elementdən başlayacaq.
public Spliterator <E> spliterator()
Java 8, ayırıcı iterator adlanan gec bağlanma və uğursuz sürətli iteratorun yeni növünü təqdim edir. Separator iteratorları elementlərin ardıcıllığını təkrarlamağa imkan verir, lakin onlar fərqli şəkildə istifadə olunur. Spliterator interfeysinin ən mühüm xüsusiyyəti onun elementlər ardıcıllığının ayrı-ayrı hissələrinin paralel iterasiyasını və buna görə də paralel proqramlaşdırmanı dəstəkləmək qabiliyyətidir.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION