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 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.
Beləliklə, indeksə element daxil edildikdə və massivdə boş yerlər olmadıqda, çağırış
Siz həmçinin istifadə edərək kolleksiyamıza elementlər əlavə edə bilərsiniz
Gəlin 3-cü indeksdəki elementi aşağıdakı massivdən çıxarmağa çalışaq:
Metodun ikinci versiyasını nəzərdən keçirək:
Keçilmiş kolleksiyaya aid olmayan elementləri silir:
Deyək ki, kolleksiyamız var:
Elementlərin dəyişdirilməsi
Kolleksiyada elementləri yoxlayın:
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 size
beşə 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 .length
ArrayList 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ıbprivate
, 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.
public ArrayList()
– 10 elementdən ibarət boş siyahı massivi yaradır;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);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.
List < String> list = new ArrayList<>();
Yeni yaradılmış obyekt list
xassələri (sahələr) elementData
və size
. Dəyər anbarı, bizim vəziyyətimizdə elementData
xü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[]
add()
public boolean add(E элемент)
Yaxşı, əlavə edək: list.add("0");
Bu metodun daxilində metodun həddən artıq yüklənmiş versiyası çağırılır add()
, kimi işarələnir private
və 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ığı copyOf
metodun 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.copyOf
Müvafiq olaraq, daxili olaraq sistem metodundan istifadə edən yeni bir massiv yaradılır və çağırılır System.arraycopy()
. Və ya JavaRush-dakı bir məqalədən aydın bir nümunə: Bü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 size
bir 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 size
bir 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:
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.
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ə) size
təsir edir . capacity
Bir daha vurğulayıram ki, size
hər ikisi capacity
fə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ə capacity
azalmayacaq! Tutaq ki: biz 100 element daxil etdik, ilk 50-ni sildik, size
o, 50-yə bərabər olacaq və beləliklə, capacity
100 olaraq qalacaq. və -i azaltmaq üçün bütün tutumumuzu cari ölçüyə uyğunlaşdıran capacity
metoddan 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).
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> list
mü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.
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ə for
massivin 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.
public boolean retainAll(Collection< ?> c)
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 listSecond
qalacaq:
"White"
"Red"
"Yaşıl" silindiyi üçün, bu da listFirst
. Ancaq listSecond.removeAll(listFirst)
bundan sonra listSecond
qalacaq:
"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 Collection
və 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. Predicate
Gə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;
}
}
String
Baş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");
removeIf
Obyektimizi şə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ı].
public E set(int index, E element)
Müəyyən edilmiş mövqedəki elementi index
keç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.
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 UnaryOperator
və 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;
}
}
String
Baş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");
replaceAll
Obyektimizi ö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:
- bəzi əməliyyatları sürətləndirmək;
- kolleksiyanı birbaşa qəbul etmək üçün çox yüklənməmiş metoda parametr kimi massivi ötürmək;
- Yeni kolleksiya əsaslı kodun kolleksiyaları tanımayan köhnə kodla inteqrasiyası.
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ə accept
interfeys 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 < 0
və 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.
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/remove
bu 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 ListIterator
interfeysi genişləndirir . Iterator
Hə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.
GO TO FULL VERSION