JavaRush /Java блогы /Random-KK /Java тіліндегі ArrayList класы

Java тіліндегі ArrayList класы

Топта жарияланған
Сәлеметсіз бе! Алдыңғы дәрістерде біз массив сияқты деректер құрылымын егжей-тегжейлі қарастырдық және олармен жұмыс істеудің жалпы мысалдарын қарастырдық. Бірақ бұл деректер құрылымының бірқатар кемшіліктері бар. Java тілінде оларға жауап 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 қарапайым массивке негізделген :) Иә, оның ішінде біздің элементтер сақталатын массив бар. Бірақ 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(): Біз оған қажетті нысанға сілтеме береміз және 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
Дұрыс, нысан thomasшын мәнінде ұяшықта сақталады 0. Массивтердің кемшіліктері ғана емес, сонымен қатар сөзсіз артықшылықтары бар. Олардың бірі элементті индекс бойынша іздеу. Біз индексті, яғни жадтағы белгілі бір addressті көрсететіндіктен, мұндай массив іздеу өте жылдам жүреді. 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 құрамында белгілі бір нысан бар-жоғын оңай білуге ​​болады. Бұл әдіс арқылы жүзеге асырылады 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));
}
booleanӘдіс элементтің ArrayList ішкі массивінде бар-жоғын тексереді және нәтижені - trueнемесе пішінінде қайтарады false. Қорытынды:

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