JavaRush /Java blogi /Random-UZ /Java-dagi ArrayList klassi

Java-dagi ArrayList klassi

Guruhda nashr etilgan
Salom! Oldingi ma'ruzalarda biz massiv kabi ma'lumotlar strukturasini batafsil ko'rib chiqdik va ular bilan ishlashning umumiy misollarini ko'rib chiqdik. Ammo bu ma'lumotlar strukturasi bir qator kamchiliklarga ega. Java-da ularga javob ArrayList-ning paydo bo'lishi edi. Iloji boricha sodda qilib aytadigan bo'lsak, Java-dagi ArrayList ko'plab yangi xususiyatlarga ega "yangilangan" massivdir.Sinflar roʻyxati - 1

Java Arraylist oddiy massivlardan nimasi bilan farq qiladi?

Umuman olganda, massivlar juda qulay va siz allaqachon sezganingizdek, ular bilan ko'p narsalarni qilish mumkin :) Biroq, massivlarning ham bir qator kamchiliklari bor.
  • Cheklangan o'lcham. Massiv yaratish bosqichida siz qancha hujayradan iborat bo'lishi kerakligini bilishingiz kerak. Agar siz kerakli miqdorni kam baholasangiz, etarli joy bo'lmaydi. Agar siz uni ortiqcha baholasangiz, massiv yarmi bo'sh qoladi va bu unchalik yomon emas. Axir, siz ham unga kerak bo'lgandan ko'ra ko'proq xotira ajratasiz.
  • Massivda elementlar qo‘shish usullari yo‘q. Siz har doim elementni qo'shmoqchi bo'lgan katak indeksini aniq ko'rsatishingiz kerak. Agar siz tasodifan allaqachon egallab olingan katakchani kerakli qiymat bilan belgilasangiz, uning ustiga yoziladi.
  • Elementni olib tashlashning usullari yo'q. Qiymat faqat "nol" bo'lishi mumkin.
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 + '\'' +
               '}';
   }
}
Xulosa:

[Cat{name='Томас'}, null, Cat{name='Фorпп Маркович'}]
Ushbu kamchiliklarning barchasini ArrayList yordamida yo'q qilish mumkin. U juda sodda tarzda yaratilgan:
ArrayList<Cat> cats = new ArrayList<Cat>();
Endi biz ob'ektlarni saqlash uchun ro'yxat yaratdik Cat. Diqqat qilish:biz ArrayList hajmini belgilamaymiz, chunki u avtomatik ravishda kengaytiriladi. Bu qanday mumkin? Osonlik bilan. Siz hayron qolasiz, lekin ArrayList oddiy massivga asoslangan :) Ha, uning ichida bizning elementlarimiz saqlanadigan massiv mavjud. Ammo ArrayList-da u bilan ishlash uchun maxsus mexanizm mavjud:
  • Ushbu ichki massiv to'lganida, ArrayList o'zida yangi massiv yaratadi. Uning o'lchami = (eski massivning o'lchami * 1,5) +1.
  • Barcha ma'lumotlar eski massivdan yangisiga ko'chiriladi
  • Eski massiv axlat yig'uvchi tomonidan olib tashlanadi.
Ushbu mexanizm tufayli ArrayList (massivdan farqli o'laroq) yangi element qo'shish usulini amalga oshiradi. Bu usul add().
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<Cat>();
   cats.add(new Cat("Hippopotamus"));
}
Yangi element ro'yxatning oxiriga qo'shiladi. Endi toshib ketish xavfi yo'q, shuning uchun bu mexanizm butunlay xavfsizdir. Aytgancha, ArrayList nafaqat indeks bo'yicha ob'ektni qidira oladi, balki aksincha - ob'ektga havola orqali ArrayListdagi ob'ekt indeksini topishi mumkin! Buning uchun u usulni amalga oshiradi indexOf(): Biz unga kerakli ob'ektga havolani o'tkazamiz va indexOf()u o'z indeksini bizga qaytaradi:
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);
}
Xulosa:

0
To'g'ri, ob'ekt thomasaslida hujayrada saqlanadi 0. Massivlar nafaqat kamchiliklarga, balki shubhasiz afzalliklarga ham ega. Ulardan biri elementni indeks bo'yicha qidirishdir. Biz indeksga, ya'ni xotiradagi ma'lum bir manzilga ishora qilganimiz uchun bunday massivni qidirish juda tez amalga oshiriladi. Java-dagi ArrayList ham buni qila oladi! Buning uchun u usulni amalga oshiradi 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);
}
Xulosa:

Cat{name='Бегемот'}
Bundan tashqari, ArrayList-da ma'lum bir ob'ekt bor yoki yo'qligini osongina bilib olishingiz mumkin. Bu usul yordamida amalga oshiriladi 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));
}
Usul elementning ArrayList ichki massivida mavjudligini tekshiradi va natijani boolean- trueyoki shaklida qaytaradi false. Xulosa:

false
Va kiritish haqida yana bir muhim narsa. ArrayList faqat massiv oxiriga emas, balki indeks bo'yicha istalgan katakka ma'lumotlarni kiritish imkonini beradi. Buning uchun ikkita usul mavjud:
  • add(int index, Cat element)
  • set(int index, Cat element)
Ikkalasiga ham siz kiritmoqchi bo'lgan katak indeksini va ob'ektning o'ziga havolani uzatasiz. Farqi shundaki, joylashtirish set()yacheykada saqlangan eski qiymatning ustiga yoziladi. Birinchi qatorga kiritish esa massivning oxirigacha add()barcha elementlarni siljitadi va natijada paydo bo'lgan bo'sh katakka kerakli ob'ektni qo'shadi. [index]Mana bir misol:
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());
}
Xulosa:

[[Cat{name='Томас'}, Cat{name='Бегемот'}]
[Cat{name='Фorпп Маркович'}, Cat{name='Бегемот'}]
Bizda 2 ta mushuk ro'yxati bor edi, biz set()hujayraga usul orqali boshqasini kiritdik 0. Natijada, bu katakda saqlangan eski qiymat yangisi bilan almashtirildi.
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());
}
Lekin u add()boshqacha ishladi. U barcha elementlarni o'ngga siljitdi va keyin yangi qiymatni hujayraga yozdi 0. Xulosa:

[Cat{name='Томас'}, Cat{name='Бегемот'}]
[Cat{name='Фorпп Маркович'}, Cat{name='Томас'}, Cat{name='Бегемот'}]
Ro'yxatni to'liq tozalash uchun quyidagi usuldan foydalaning 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());
}
Xulosa:

[]
Barcha kontent roʻyxatdan oʻchirildi. Aytgancha, e'tibor bering: massivlardan farqli o'laroq, ArrayList-da toString() usuli bekor qilinadi va darhol ro'yxatni string formatida ko'rsatadi. Massivlarda biz buning uchun Arrays sinfidan foydalanishimiz kerak edi. Va biz Massivlarni eslaganimiz uchun: Java-da siz massiv va ArrayList o'rtasida osongina "almashishingiz", ya'ni birini boshqasiga o'zgartirishingiz mumkin. Arrays sinfida buning uchun Arrays.asList() usuli mavjud. Uning yordami bilan biz massiv tarkibini ro'yxat sifatida olamiz va uni ArrayList konstruktoriga o'tkazamiz:
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);
}
Xulosa:

[Cat{name='Томас'}, Cat{name='Бегемот'}, Cat{name='Фorпп Маркович'}, Cat{name='Пушок'}]
Buning teskarisini qilishingiz mumkin - ArrayList obyektidan massiv oling. Buning uchun toArray() usulidan foydalaning:
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));
}
Iltimos, diqqat qiling: biz toArray() usuliga bo'sh massiv o'tkazdik. Bu xato emas. ArrayList sinfida bu usul shunday amalga oshiriladiki, bo'sh massivni o'tkazish uning ishlashini oshiradi. Hozircha buni faqat kelajak uchun eslab qoling (lekin siz ma'lum bir o'lchamni ham o'tkazishingiz mumkin, u ishlaydi). Hajmi haqida gapirganda. Ro'yxatning joriy hajmini quyidagi usul yordamida topish mumkin 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());
}
Bu erda shuni tushunish kerakki, lengthmassiv xossasidan farqli o'laroq, ArrayList.size() usuli boshlang'ich sig'imni emas, balki aynan elementlar sonini qaytaradi, chunki biz ArrayListni yaratishda uni belgilamaymiz. Aytgancha, odatda buni ko'rsatish mumkin. ArrayList da tegishli konstruktor mavjud. Ammo yangi elementlarni qo'shish nuqtai nazaridan uning xatti-harakati o'zgarmaydi:
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 chiqishi:

4
Biz 2 ta elementdan iborat roʻyxat yaratdik, lekin bizga kerak boʻlganda, u osongina kengaytirildi. Yana bir narsa shundaki, agar biz dastlab juda kichik ro'yxatni yaratgan bo'lsak, u kengaytirish operatsiyasini tez-tez amalga oshirishi kerak bo'ladi va bu ma'lum miqdorda resurslarni sarflaydi. Ushbu ma'ruzada biz ArrayList dan elementlarni olib tashlash jarayoniga zo'rg'a to'xtalib o'tdik. Albatta, bu unutuvchanlikdan emas. Ushbu mavzu alohida ma'ruzaga ajratilgan, uni batafsilroq o'qishingiz mumkin :)
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION