JavaRush /Java Blogu /Random-AZ /Java-da ArrayList sinfi

Java-da ArrayList sinfi

Qrupda dərc edilmişdir
Salam! Əvvəlki mühazirələrdə biz bir massiv kimi məlumat strukturunu ətraflı araşdırdıq və onlarla işləməyin ümumi nümunələrinə baxdıq. Lakin bu məlumat strukturunun bir sıra çatışmazlıqları var. Java-da onlara cavab ArrayList-in görünüşü idi. Mümkün qədər sadə desək, Java-da ArrayList çoxlu yeni funksiyaları olan “təkmilləşdirilmiş” massivdir.Sinif ArrayList - 1

Java Arraylist adi massivlərdən nə ilə fərqlənir?

Ümumiyyətlə, massivlər kifayət qədər rahatdır və artıq qeyd etdiyiniz kimi, onlarla çox şey etmək olar :) Bununla belə, massivlərin bir sıra çatışmazlıqları da var.
  • Məhdud ölçü. Artıq massiv yaratma mərhələsində onun neçə hüceyrədən ibarət olduğunu bilməlisiniz. Tələb olunan məbləği az qiymətləndirirsinizsə, kifayət qədər yer olmayacaq. Əgər onu həddindən artıq qiymətləndirsəniz, massiv yarı boş qalacaq və bu o qədər də pis deyil. Axı, məlum olur ki, siz də bunun üçün lazım olduğundan daha çox yaddaş ayıracaqsınız.
  • Massivin elementləri əlavə etmək üsulları yoxdur. Siz həmişə elementi əlavə etmək istədiyiniz xananın indeksini açıq şəkildə göstərməlisiniz. Təsadüfən artıq işğal olunmuş xananı istənilən dəyərlə qeyd etsəniz, onun üzərinə yazılacaq.
  • Elementi silmək üçün heç bir üsul yoxdur. Dəyər yalnız "sıfırlana bilər".
public class Cat {

   private String name;

   public Cat(String name) {
       this.name = name;
   }

   public static void main(String[] args) {

       Cat[] cats = new Cat[3];
       cats[0] = new Cat("Thomas");
       cats[1] = new Cat("Hippopotamus");
       cats[2] = new Cat("Philip Markovich");

       cats[1] = null;



       System.out.println(Arrays.toString(cats));
   }

   @Override
   public String toString() {
       return "Cat{" +
               "name='" + name + '\'' +
               '}';
   }
}
Nəticə:

[Cat{name='Томас'}, null, Cat{name='Фorпп Маркович'}]
Bütün bu çatışmazlıqlar ArrayList istifadə edərək aradan qaldırıla bilər. Çox sadə şəkildə yaradılmışdır:
ArrayList<Cat> cats = new ArrayList<Cat>();
İndi biz obyektləri saxlamaq üçün siyahı yaratdıq Cat. Diqqət edin:biz ArrayList-in ölçüsünü təyin etmirik, çünki o, avtomatik genişləndirilə bilər. Bu necə mümkündür? Asanlıqla. Təəccüblənəcəksiniz, amma ArrayList adi massiv üzərində qurulub :) Bəli, onun daxilində elementlərimizin saxlandığı massiv var. Lakin ArrayList-in onunla işləmək üçün xüsusi mexanizmi var:
  • Bu daxili massiv dolu olduqda, ArrayList öz daxilində yeni massiv yaradır. Onun ölçüsü = (köhnə massivin ölçüsü * 1.5) +1.
  • Bütün məlumatlar köhnə massivdən yenisinə kopyalanır
  • Köhnə massiv zibil kollektoru tərəfindən silinir.
Bu mexanizm sayəsində ArrayList (massivdən fərqli olaraq) yeni element əlavə etmək üçün bir üsul həyata keçirir. Bu bir üsuldur add().
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<Cat>();
   cats.add(new Cat("Hippopotamus"));
}
Yeni element siyahının sonuna əlavə olunur. İndi daşqın riski yoxdur, buna görə də bu mexanizm tamamilə təhlükəsizdir. Yeri gəlmişkən, ArrayList yalnız indeks üzrə obyekti axtara bilməz, həm də əksinə - obyektə istinad edərək ArrayList-də obyektin indeksini tapa bilər! Bunun üçün o, metodu həyata keçirir indexOf(): İstədiyimiz obyektə keçidi ona ötürürük və indexOf()o öz indeksini bizə qaytarır:
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   int thomasIndex = cats.indexOf(thomas);
   System.out.println(thomasIndex);
}
Nəticə:

0
Düzdür, obyekt thomasəslində hüceyrədə saxlanılır 0. Massivlərin təkcə mənfi cəhətləri deyil, həm də şübhəsiz üstünlükləri var. Onlardan biri elementi indekslə axtarır. Biz indeksə, yəni yaddaşda olan konkret ünvana işarə etdiyimiz üçün belə massiv axtarışı çox sürətli olur. Java-da ArrayList də bunu edə bilər! Bunu etmək üçün bir üsul tətbiq edir get():
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   Cat secondCat = cats.get(1);

   System.out.println(secondCat);
}
Nəticə:

Cat{name='Бегемот'}
Həmçinin, ArrayList-də müəyyən bir obyektin olub-olmadığını asanlıqla öyrənə bilərsiniz. Bu üsuldan istifadə etməklə edilir contains():
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   cats.remove(pushok);
   System.out.println(cats.contains(pushok));
}
booleanMetod elementin ArrayList-in daxili massivində olub olmadığını yoxlayır və nəticəni - truevə ya şəklində qaytarır false. Nəticə:

false
Və əlavə ilə bağlı başqa bir vacib şey. ArrayList məlumatı yalnız massivin sonuna deyil, həm də indeks üzrə istənilən xanaya daxil etməyə imkan verir. Bunun üçün iki üsul var:
  • add(int index, Cat element)
  • set(int index, Cat element)
Hər ikisinə siz daxil etmək istədiyiniz xananın indeksini və obyektin özünə keçid verirsiniz. Fərq ondadır ki, yapışdırmaq set()xanada saxlanan köhnə dəyərin üzərinə yazır. Və birincidən daxil etmək massivin sonundan add()başlayaraq bütün elementləri dəyişdirir və nəticədə boş xanaya lazım olan obyekti əlavə edir. [index]Budur bir nümunə:
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);

   System.out.println(cats.toString());

   cats.set(0, philipp);//Now we have a list of 2 cats. We add the 3rd via set:

   System.out.println(cats.toString());
}
Nəticə:

[[Cat{name='Томас'}, Cat{name='Бегемот'}]
[Cat{name='Фorпп Маркович'}, Cat{name='Бегемот'}]
2 pişikdən ibarət bir siyahımız var idi, başqa birini üsulla set()hüceyrəyə daxil etdik 0. Nəticədə, bu xanada saxlanılan köhnə dəyər yenisi ilə əvəz olundu.
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);

   System.out.println(cats.toString());

   cats.add(0, philipp);//Now we have a list of 2 cats. Add the 3rd via add

   System.out.println(cats.toString());
}
Amma add()fərqli işləyirdi. O, bütün elementləri sağa keçirdi və sonra yeni dəyəri xanaya yazdı 0. Nəticə:

[Cat{name='Томас'}, Cat{name='Бегемот'}]
[Cat{name='Фorпп Маркович'}, Cat{name='Томас'}, Cat{name='Бегемот'}]
Siyahını tamamilə təmizləmək üçün metoddan istifadə edin clear():
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   cats.clear();

   System.out.println(cats.toString());
}
Nəticə:

[]
Bütün məzmun siyahıdan silindi. Yeri gəlmişkən, diqqət yetirin: massivlərdən fərqli olaraq, ArrayList-də toString() metodu ləğv edilir və dərhal siyahını sətir formatında göstərir. Massivlərdə bunun üçün Arrays sinfindən istifadə etməli olduq. Massivləri xatırladığımız üçün: Java-da siz asanlıqla massivlə ArrayList arasında “keçidə” bilərsiniz, yəni birini digərinə çevirə bilərsiniz. Arrays sinfinin bunun üçün Arrays.asList() metodu var. Onun köməyi ilə biz massivin məzmununu siyahı kimi alırıq və onu ArrayList-in konstruktoruna veririk:
public static void main(String[] args) {

   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   Cat[] catsArray = {thomas, behemoth, philipp, pushok};

   ArrayList<Cat> catsList = new ArrayList<>(Arrays.asList(catsArray));
   System.out.println(catsList);
}
Nəticə:

[Cat{name='Томас'}, Cat{name='Бегемот'}, Cat{name='Фorпп Маркович'}, Cat{name='Пушок'}]
Siz bunun əksini edə bilərsiniz - ArrayList obyektindən massiv alın. Bunun üçün toArray() metodundan istifadə edin:
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();

   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   Cat[] catsArray = cats.toArray(new Cat[0]);

   System.out.println(Arrays.toString(catsArray));
}
Diqqət edin: biz toArray() metoduna boş massiv keçdik. Bu səhv deyil. ArrayList sinfinin daxilində bu üsul elə həyata keçirilir ki, boş massivdən keçmək onun məhsuldarlığını artırır. Hələlik, bunu gələcək üçün xatırlayın (lakin müəyyən bir ölçü də köçürə bilərsiniz, işləyəcək). Ölçüdən danışarkən. Siyahının cari ölçüsünü metoddan istifadə etməklə tapmaq olar size():
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();


   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   System.out.println(cats.size());
}
Burada başa düşmək vacibdir ki, lengthmassiv xassəsindən fərqli olaraq, ArrayList.size() metodu ilkin tutumu deyil, məhz elementlərin sayını qaytarır, çünki biz ArrayList yaradarkən onu göstərmirik. Yeri gəlmişkən, bunu ümumiyyətlə göstərmək olar. ArrayList-in müvafiq konstruktoru var. Lakin yeni elementlər əlavə etmək baxımından onun davranışı dəyişməyəcək:
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>(2);//create an ArrayList with an initial capacity of 2


   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   System.out.println(cats.size());
}
Konsol çıxışı:

4
Biz 2 elementdən ibarət bir siyahı yaratdıq, lakin ehtiyac duyduqda asanlıqla genişləndirildi. Başqa bir şey odur ki, biz əvvəlcə çox kiçik bir siyahı yaratsaq, o, genişləndirmə əməliyyatını daha tez-tez həyata keçirməli olacaq və bu, müəyyən miqdarda resurs sərf edir. Bu mühazirədə biz ArrayList-dən elementlərin çıxarılması prosesinə azca toxunduq. Təbii ki, bu unutqanlıqdan irəli gəlmir. Bu mövzu ayrıca mühazirə şəklində ayrılıb, daha sonra oxuya bilərsiniz :)
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION