JavaRush /Блоги Java /Random-TG /Синфи ArrayList дар Java

Синфи ArrayList дар Java

Дар гурӯҳ нашр шудааст
Салом! Дар лексияҳои қаблӣ мо чунин сохтори додаҳоро ба мисли массив муфассал баррасӣ карда, мисолҳои маъмули кор бо онҳоро дида баромадем. Аммо ин сохтори додаҳо як қатор камбудиҳо дорад. Ҷавоб ба онҳо дар Java пайдоиши ArrayList буд. Ба қадри имкон содда гӯем, ArrayList дар Java массиви "такмилшуда" бо бисёр хусусиятҳои нав мебошад.Синфи ArrayList - 1

Java Arraylist аз массивҳои муқаррарӣ чӣ фарқ дорад?

Умуман, массивҳо хеле қулайанд ва чунон ки шумо аллакай қайд кардед, шумо метавонед бо онҳо корҳои зиёдеро анҷом диҳед :) Аммо, массивҳо як қатор камбудиҳо низ доранд.
  • Андозаи маҳдуд. Шумо бояд аллакай дар марҳилаи сохтани массив донед, ки он бояд чанд ҳуҷайра дошта бошад. Агар шумо миқдори заруриро кам кунед, ҷой намерасад. Агар шумо онро аз ҳад зиёд баҳо диҳед, массив нисфи холӣ мемонад ва ин он қадар бад нест. Баъд аз ҳама, маълум мешавад, ки шумо инчунин барои он аз зарурӣ бештар хотира ҷудо мекунед.
  • Массив усулҳои илова кардани элементҳо надорад. Шумо бояд ҳамеша индекси чашмакеро, ки дар он элемент илова кардан мехоҳед, ба таври возеҳ муайян кунед. Агар шумо тасодуфан ячейкаи аллакай ишғолшударо бо ягон арзиши дилхоҳ муайян кунед, он аз нав навишта мешавад.
  • Ягон усулҳои нест кардани элемент вуҷуд надорад. Қимат танҳо метавонад "сифр" шавад.
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пп Маркович'}]
Ҳамаи ин камбудиҳоро бо истифода аз ArrayList бартараф кардан мумкин аст. Он хеле содда сохта шудааст:
ArrayList<Cat> cats = new ArrayList<Cat>();
Ҳоло мо рӯйхатеро барои нигоҳ доштани an objectҳо сохтаем Cat. Диққат диҳед:мо андозаи ArrayList-ро муайян намекунем, зеро он ба таври худкор васеъ карда мешавад. Ин чӣ гуна имконпазир аст? Ба осонӣ. Шумо ҳайрон мешавед, аммо ArrayList ба массиви оддӣ асос ёфтааст :) Бале, дар дохor он массив мавҷуд аст, ки дар он элементҳои мо нигоҳ дошта мешаванд. Аммо ArrayList дорои механизми махсуси кор бо он аст:
  • Вақте ки ин массиви дохилӣ пур мешавад, ArrayList дар дохor худ массиви нав эҷод мекунад. Андозаи он = (андозаи массиви кӯҳна * 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. Массивҳо на танҳо камбудиҳо, балки бартариҳои бешубҳа низ доранд. Яке аз онҳо ҷустуҷӯи элемент аз рӯи индекс аст. Азбаски мо ба индекс, яъне суроғаи мушаххас дар хотира ишора мекунем, чунин ҷустуҷӯи массив хеле зуд аст. ArrayList дар Java низ ин корро карда метавонад! Барои ин, он як усулро амалӣ мекунад 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));
}
Усул тафтиш мекунад, ки оё элемент дар массиви дохorи ArrayList мавҷуд аст ва натиҷаро дар шакли boolean- trueё false. Хулоса:

false
Ва боз як чизи муҳим дар бораи ворид кардан. ArrayList ба шумо имкон медиҳад, ки маълумотро на танҳо дар охири массив, балки ба ҳама ячейка аз рӯи индекс дохил кунед. Он барои ин ду усул дорад:
  • add(int index, Cat element)
  • set(int index, Cat element)
Ба ҳарду, шумо индекси чашмакеро, ки ба он дохил кардан мехоҳед, ва истиноди худи an objectро мегузоред. Фарқият дар он аст, ки часбонидан set()арзиши пешинаи дар ячейка нигоҳ дошташударо аз нав сабт мекунад. Ва ба воситаи add()аввал ворид кардани ҳамаи элементҳо аз [index]охири массив сар карда, an objectи лозимиро ба чашмаки холии натиҷавӣ илова мекунад. Инак як мисол:
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='Пушок'}]
Шумо метавонед баръакс амал кунед - аз an objectи ArrayList массив гиред. Барои ин, усули 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() гузаштем. Ин хато нест. Дар дохor синфи 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