JavaRush /Java блогу /Random-KY /Javaдагы ArrayList классы

Javaдагы ArrayList классы

Группада жарыяланган
Салам! Мурунку лекцияларда биз массив сыяктуу берorштердин структурасын майда-чүйдөсүнө чейин карап чыктык жана алар менен иштөөнүн жалпы мисалдарын карап чыктык. Бирок бул маалымат структурасы бир катар кемчorктерге ээ. Javaда аларга жооп ArrayListтин пайда болушу болду. Мүмкүн болушунча жөнөкөй тил менен айтканда, Javaдагы ArrayList – бул көптөгөн жаңы функцияларды камтыган “жаңыртылган” массив.Class ArrayList - 1

Java Arraylist кадимки массивдерден эмнеси менен айырмаланат?

Жалпысынан массивдер абдан ыңгайлуу жана сиз буга чейин байкагандай, алар менен көп нерселерди жасай аласыз :) Бирок, массивдердин дагы бир катар кемчorктери бар.
  • Чектелген өлчөмү. Сиз массивди түзүү стадиясында канча клетканы камтышы керектигин бorшиңиз керек. Эгер сиз керектүү сумманы бааласаңыз, анда орун жетишсиз болот. Эгер сиз аны ашыкча бааласаңыз, массив жарым бош бойдон калат жана бул анчалык деле жаман эмес. Анын үстүнө, сиз дагы ага керектүүдөн көбүрөөк эс бөлөсүз.
  • Массивде элементтерди кошуу ыкмалары жок. Сиз ар дайым элементти кошкуңуз келген уячанын индексин так көрсөтүшүңүз керек. Эгер сиз кокусунан кандайдыр бир керектүү мааниге ээ болгон уячаны көрсөтсөңүз, анын үстүнө жазылат.
  • Элементти алып салуу ыкмалары жок. Маани гана "нөлгө" болот.
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 + '\'' +
               '}';
   }
}
Жыйынтык:

[Cat{name='Томас'}, null, Cat{name='Фorпп Маркович'}]
Бул кемчorктердин баарын ArrayList аркылуу жоюуга болот. Бул абдан жөнөкөй түзүлгөн:
ArrayList<Cat> cats = new ArrayList<Cat>();
Азыр биз an objectтерди сактоо үчүн тизме түздүк Cat. Көңүл буруу:биз ArrayListтин өлчөмүн тактабайбыз, анткени ал автоматтык түрдө кеңейтилет. Бул кантип мүмкүн? Оңой. Сиз таң каласыз, бирок ArrayList кадимки массивге негизделген :) Ооба, анын ичинде биздин элементтер сакталган массив бар. Бирок ArrayList аны менен иштөө үчүн атайын механизми бар:
  • Бул ички массив толгондо, ArrayList өзүнүн ичинде жаңы массивди түзөт. Анын өлчөмү = (эски массивдин өлчөмү * 1,5) +1.
  • Бардык маалыматтар эски массивден жаңысына көчүрүлөт
  • Эски массив таштанды жыйноочу тарабынан алынып салынат.
Бул механизмдин аркасында ArrayList (массивден айырмаланып) жаңы элементти кошуу ыкмасын ишке ашырат. Бул ыкма add().
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<Cat>();
   cats.add(new Cat("Hippopotamus"));
}
Жаңы элемент тизменин аягына кошулат. Азыр толуп кетүү коркунучу жок, ошондуктан бул механизм толугу менен коопсуз. Айтмакчы, ArrayList an objectти индекс боюнча гана издебестен, тескерисинче, an objectтин индексин ArrayListтен an objectке шилтеме аркылуу таба алат! Бул үчүн, ал ыкманы ишке ашырат indexOf(): Биз ага керектүү an objectке шилтемени өткөрөбүз жана indexOf()ал бизге өзүнүн индексин кайтарып берет:
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);
}
Жыйынтык:

0
Туура, an object thomasчындыгында уячада сакталат 0. Массивдердин кемчorктери гана эмес, талашсыз артыкчылыктары да бар. Алардын бири элементти индекс боюнча издөө. Биз индексти, башкача айтканда, эс тутумдагы белгилүү бир даректи көрсөткөндүктөн, мындай массивди издөө абдан тез болот. Javaдагы ArrayList да муну жасай алат! Бул үчүн, ал бир ыкманы ишке ашырат 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);
}
Жыйынтык:

Cat{name='Бегемот'}
Ошондой эле, сиз ArrayListте белгилүү бир an object бар же жок экенин оңой биле аласыз. Бул ыкманы колдонуу менен жүзөгө ашырылат 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));
}
Метод элементтин ArrayListтин ички массивинде камтылганын текшерет жана натыйжаны boolean- trueже формасында кайтарат false. Жыйынтык:

false
Жана киргизүү жөнүндө дагы бир маанилүү нерсе. ArrayList маалыматтарды массивдин аягына гана эмес, индекс боюнча каалаган уячага киргизүүгө мүмкүндүк берет. Бул үчүн эки ыкмасы бар:
  • add(int index, Cat element)
  • set(int index, Cat element)
Экөөнө тең сиз киргизгиңиз келген уячанын индексин жана an objectтин өзүнө шилтеме бересиз. Айырмасы, чаптоо set()уячада сакталган эски маанини кайра жазат. Ал эми биринчи аркылуу киргизүү массивдин аягына чейин add()бардык элементтерди жылдырат жана пайда болгон бош уячага керектүү an objectти кошот. [index]Бул жерде бир мисал:
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());
}
Жыйынтык:

[[Cat{name='Томас'}, Cat{name='Бегемот'}]
[Cat{name='Фorпп Маркович'}, Cat{name='Бегемот'}]
Бизде 2 мышыктын тизмеси бар болчу, биз set()клеткага ыкма аркылуу дагы бир мышык киргиздик 0. Натыйжада, бул уячада сакталган эски маани жаңысына алмаштырылды.
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());
}
Бирок ал add()башкача иштеди. Ал бардык элементтерди оңго жылдырып, андан кийин жаңы маанини уячага жазды 0. Жыйынтык:

[Cat{name='Томас'}, Cat{name='Бегемот'}]
[Cat{name='Фorпп Маркович'}, Cat{name='Томас'}, Cat{name='Бегемот'}]
Тизмени толугу менен тазалоо үчүн, төмөнкү ыкманы колдонуңуз 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());
}
Жыйынтык:

[]
Бардык мазмун тизмеден алынып салынды. Баса, көңүл буруңуз: массивдерден айырмаланып, ArrayListте toString() ыкмасы жокко чыгарылып, тизмени сап форматында дароо көрсөтөт. Массивдерде биз бул үчүн Arrays классын колдонушубуз керек болчу. Жана биз Массивдерди эстегендиктен: Javaда сиз массив менен ArrayListтин ортосунда оңой эле "которула аласыз", башкача айтканда бирин экинчисине которсоңуз болот. Arrays классында бул үчүн Arrays.asList() ыкмасы бар. Анын жардамы менен массивдин мазмунун тизме катары алабыз жана аны ArrayList конструкторуна өткөрүп беребиз:
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);
}
Жыйынтык:

[Cat{name='Томас'}, Cat{name='Бегемот'}, Cat{name='Фorпп Маркович'}, Cat{name='Пушок'}]
Сиз тескерисинче кыла аласыз - ArrayList an objectинен массив алыңыз. Бул үчүн, toArray() ыкмасын колдонуңуз:
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));
}
Көңүл буруңуз: биз бош массивди toArray() ыкмасына өткөрдүк. Бул ката эмес. ArrayList классынын ичинде бул ыкма бош массивди өткөрүү анын өндүрүмдүүлүгүн жогорулата тургандай ишке ашырылат. Азырынча муну келечекте эстеп көрүңүз (бирок сиз да белгилүү бир өлчөмдү которо аласыз, ал иштейт). Өлчөмү жөнүндө айтсак. Тизменин учурдагы көлөмүн төмөнкү ыкма менен тапса болот 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());
}
Бул жерде түшүнүү маанилүү, lengthмассив касиетинен айырмаланып, ArrayList.size() методу баштапкы сыйымдуулукту эмес, элементтердин так санын кайтарат, анткени биз ArrayListти түзүүдө аны тактабайбыз. Айтмакчы, аны жалпысынан көрсөтүүгө болот. ArrayListтин тиешелүү конструктору бар. Бирок жаңы элементтерди кошуу жагынан анын жүрүм-туруму өзгөрбөйт:
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());
}
Консолдук чыгаруу:

4
Биз 2 элементтен турган тизме түздүк, бирок бизге керек болгондо, ал оңой эле кеңейтилди. Дагы бир нерсе, биз башында абдан кичинекей тизме түзсө, анда ал кеңейтүү операциясын бат-баттан жүргүзүүгө туура келет жана бул белгилүү бир өлчөмдөгү ресурстарды талап кылат. Бул лекцияда биз ArrayListтен элементтерди алып салуу процессине араң токтолдук. Албетте, бул унутчаактыктан эмес. Бул тема өзүнчө лекцияга бөлүнгөн, андан ары окуй аласыз :)
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION