JavaRush /Java блогы /Random-KK /ArrayList класының егжей-тегжейлі талдауы [1-бөлім]
Vonorim
Деңгей

ArrayList класының егжей-тегжейлі талдауы [1-бөлім]

Топта жарияланған
Бұл мақалада Collections Framework ішінен ArrayList сыныбы егжей-тегжейлі қарастырылады, ол кәдімгі массивке негізделгендіктен түсінуге оңай болуы мүмкін. Сұхбат кезінде сізге осы сынып және оны Java тілінде енгізу туралы сұрақ қойылады. Екінші бөлімде біз қалған әдістерді талдаймыз және сандар үшін динамикалық массивтің өз орындалуын жазамыз. ArrayList класы AbstractList сыныбынан мұра алады және келесі интерфейстерді жүзеге асырады: List, RandomAccess, Cloneable, Serializable. ArrayList сыныбының егжей-тегжейлі талдауы [2-бөлім] ArrayList класының егжей-тегжейлі талдауы [1-бөлім] - 1 ArrayList класы қажетінше кеңейтілуі мүмкін динамикалық массивтерді қолдайды. Оның қажеттілігі мен тиімділігі кәдімгі массивтің белгіленген ұзындыққа ие болуымен түсіндіріледі: ол жасалғаннан кейін ол өспейді немесе кішірейе алмайды, бұл массивтің қаншалықты қажет болатыны белгісіз болса, шектеулер қояды. Негізінде, ArrayList класы нысан сілтемелерінің айнымалы ұзындықтағы тізім жиымы болып табылады. Ішкі массивтің өлшемі (ұяшықтардың саны) одан элементтер жойылған кезде автоматты түрде азаймайтынын түсіну маңызды. sizeШын мәнінде, массивте нақты бар элементтердің санын көрсететін айнымалының мәні азаяды. ArrayList класының жаңа an objectісін жасап, оған 5 элемент қостық делік. Әдепкі бойынша 10 элементтен тұратын массив жасалады. Бұл жағдайда біздің нысанның сыйымдылығы (көлемі/көлемі) 10-ға тең болады, бірақ айнымалының мәні sizeбеске тең болады. Ал элементтерді жойған кезде біз айнымалы мәніндегі өзгерістерді көреміз size, өйткені .lengthArrayList класының ішкі массивіне қол жеткізіп, оның ұзындығын біле алмаймыз. Өлшемді қосымша әдіс арқылы азайтуға болады trimToSize(), ол төменде талқыланады. Класс өрістерін қарастырайық.
  • Динамикалық массивтің әдепкі көлеміне жауапты өріс:

    private static final int DEFAULT_CAPACITY = 10

    Жаңа нысанды құру кезінде жаңа ArrayList<>() (параметрлері жоқ конструктор) ішінде 10 элементтен тұратын массив жасалады.

  • Жинақтың барлық элементтері сақталатын өріс:

    transient Object[] elementData

    Түйінді сөзбен белгіленген transient– стандартты сериялау алгоритмін пайдалану кезінде өріс byte ағынына жазылмайды. Өріс кілт сөзімен белгіленбегенін атап өткен жөн private, бірақ бұл кірістірілген сыныптардан осы өріске кіруді жеңілдету үшін жасалды (мысалы, SubList).

  • Массивтегі нақты элементтердің санын сақтайтын есептегіш өріс:

    private int size

    Енгізу және жою сияқты әрекеттерді орындау кезінде мән ұлғаяды/кемітіледі.

Сыныпта тағы 3 өріс бар, бірақ мәні бойынша олар қосымша, сондықтан оларды қарастырудың қажеті жоқ. Сыныпта үш конструктор бар:
  1. public ArrayList()– 10 элементтен тұратын бос тізім массивін жасайды;
  2. public ArrayList(Collection < ? extends E > c)– өткен жиынның элементтерімен инициализацияланған тізім массивін жасайды (егер біз кейбір коллекция негізінде жаңа ArrayList жасағымыз келсе);
  3. public ArrayList(int initialCapacity)– бастапқы сыйымдылығы бар тізім массивін жасайды. Өткізілген initialCapacity параметрі 0-ден үлкен болса, онда көрсетілген өлшемді массив жасалады (iшкi өріс elementData нысаны initialCapacity өлшеміндегі жаңа массив түріне сілтеме тағайындалады). Егер параметр 0 болса, онда бос массив жасалады. Көрсетілген параметр 0-ден аз болса, IllegalArgumentException жіберіледі.
Объектіні құру
List < String> list = new ArrayList<>();
Жаңадан жасалған нысанда listқасиеттер (өрістер) elementDataжәне size. Құндылықтар қоймасы elementDataбелгілі бір түрдегі массивтен басқа ештеңе емес (жалпы – <>) біздің жағдайда String[]. Параметрлері жоқ конструктор шақырылса, әдепкі бойынша Object типті 10 элементтен тұратын массив жасалады (әрине, түрге көшірумен). ArrayList класының егжей-тегжейлі талдауы [1-бөлім] - 2Элементтерді қосу Тізім массивіне элементтерді классикалық түрде қосу шамадан тыс жүктелген нұсқалары арқылы орындалады add().
public boolean add(E элемент)
Сонымен, қосайық: Бұл әдістің ішінде деп белгіленген list.add("0"); ArrayList класының егжей-тегжейлі талдауы [1-бөлім] - 3әдістің шамадан тыс жүктелген нұсқасы шақырылады , ол өз кезегінде кіріс ретінде үш параметрді қабылдайды: қосылатын элемент, ішкі массив және оның өлшемі. Жеке әдісте тексеру орын алады: егер берілген өлшем параметрі ішкі массивтің ұзындығына тең болса (яғни массив толы), онда массив әдістің нәтижесі (өрістің ағымдағы мәні) тағайындалады. size + 1 әдісіне беріледі, өйткені қосылатын элементті ескеру қажет), онда ішкі массивке бастапқы массив элементтерін көшіру арқылы алынған жаңа құрылған массивке сілтеме тағайындалады: add()privategrow(int minCapacity)
Arrays.copyOf(elementData, newCapacity(minCapacity))
Әдістің екінші параметрі ретінде жаңа массив өлшемі есептелетін copyOfәдістің нәтижесін көрсетеміз . newCapacity(int minCapacity)Ол келесі формула арқылы есептеледі: int newCapacity = oldCapacity + (oldCapacity >> 1) Әдепкі өлшемі бар массив үшін мыналар ақиқат болады: >> 1– разряд бойынша оңға бірге жылжыту (санды оның жартысына дейін азайтатын оператор). Негізінде бұл 2-ні 1-дің дәрежесіне бөлу дегенді білдіреді. 10-ды 2-ге бөліп, 10-ды қосамыз. Барлығы массивтің жаңа сыйымдылығы 15-ке тең, бірақ біз 11-ші элементті қосып жатқандықтан, 15 + 1 болады. = 16. Тізімімізге оралайық және оған 10 элемент қостық делік және 11 қосуға тырысамыз. Тексеру массивте бос орын жоқ екенін көрсетеді. Arrays.copyOfСәйкесінше, жүйе әдісін іштей қолданатын жаңа массив жасалады және шақырылады System.arraycopy(). ArrayList класының егжей-тегжейлі талдауы [1-бөлім] - 4ArrayList класының егжей-тегжейлі талдауы [1-бөлім] - 5Немесе JavaRush-тегі бір мақаладан нақты мысал: ArrayList класының егжей-тегжейлі талдауы [1-бөлім] - 6Барлық осы тексерулерден кейін және қажет болған жағдайда массив өлшемін ұлғайту, содан кейін жеке әдісте add()массивтің соңына жаңа элемент қосылады және ағымдағы параметр sizeбір-біріне көбейтіледі. . Ескі массив кейіннен қоқыс жинаушымен өңделеді. Динамикалық массив осылай жұмыс істейді: элементтерді қосқанда, онда әлі де орын бар-жоғын тексереміз. Егер бос орын болса, онда элементті массивтің соңына қосамыз. Соңы массивтегі соңғы ұяшықты емес, мәніне сәйкес келетін ұяшықты білдіреді size. Біз массивке бірінші элементті қостық, ол [0] индексі бар ұяшыққа орналастырылған. Өрістің мәні sizeбіреуге өсті және = 1. Келесі элементті қосамыз: көреміз size = 1, сәйкесінше элементті [1] индексі бар ұяшыққа орналастырамыз және т.б. Екі параметрі бар әдістің шамадан тыс жүктелген нұсқасы бар:
public void add(int index, E element)
Элементті қосқымыз келетін ұяшықтың орнын (индексін) көрсете аламыз. Біріншіден, көрсетілген индекс мәнінің дұрыстығы тексеріледі, себебі дұрыс емес индекстің көрсетілу мүмкіндігі бар, ол ештеңе жоқ немесе жай жоқ ұяшықты көрсетеді. Индекстерді тексеру: index > size || index < 0– егер көрсетілген индекс массивтің ағымдағы өлшемінен үлкен болса немесе ол 0-ден аз болса, ерекше жағдай шығарылады IndexOutOfBoundsException. Содан кейін, қажет болса, жоғарыдағы мысалға ұқсас массив өлшемі ұлғайтылады. Сіз массивте қосу/жою әрекеттері кезінде бір нәрсенің бір жерге (оңға немесе солға) ауысатынын естіген шығарсыз. Сонымен, жылжыту массивді көшіру арқылы жүзеге асырылады: System.arraycopy(elementData, index, elementData, index + 1, s - index); Көрсетілген индекстің оң жағында орналасқан барлық элементтер бір позицияға оңға жылжытылады (индекс+1). Осыдан кейін ғана ішкі массивке көрсетілген индексте жаңа элемент қосылады. Біз массивтің бір бөлігін оңға жылжытқандықтан (жаңа массив жасалмаған), бізге қажет ұяшық жазу үшін бос болады. Ескі массивке сілтеме жойылады және болашақта оны қоқыс жинаушы қабылдайды. «Масератиді» бұрыннан бар [3] ұяшығына қойыңыз:
ArrayList класының егжей-тегжейлі талдауы [1-бөлім] - 7
Осылайша, элемент индекске енгізілгенде және массивте бос орындар болмаған кезде, шақыру System.arraycopy()екі рет орындалады: біріншісі -де grow(), екіншісі - әдістің өзінде add(index, value), бұл бүкіл қосу операциясының жылдамдығына анық әсер етеді. Нәтижесінде, ішкі массивке басқа элементті жазу қажет болғанда, бірақ ол жерде бос орын болмаса, ArrayList ішінде келесідей болады:
  • Жаңа массив бастапқыдан 1,5 есе үлкен өлшеммен және бір элементпен жасалады.
  • Ескі массивтің барлық элементтері жаңа массивке көшіріледі
  • Жаңа массив ArrayList нысанының ішкі айнымалысында сақталады, ал ескі массив қоқыс деп жарияланады.
ArrayList типті нысандардың сыйымдылығын келесі әдіс арқылы қолмен арттыруға болады:
public void ensureCapacity(int minCapacity)
Массивтің сыйымдылығын алдын ала ұлғайту арқылы сіз кейінірек ЖЖҚ-ны қосымша қайта бөлуден аулақ бола аласыз. Әдіс берілген элементтердің санын орналастыру үшін ішкі массивтің өлшемін ұлғайтады minCapacity. Әдіс ensureCapacity()өріске әсер етпейді size, ол capacityішкі массивтің (өлшеміне) әсер етеді. Мен тағы бір рет айтамын, sizeекеуі де capacityбасқа нәрсе және оларды шатастырмау өте маңызды! ArrayList құрастырылған негізгі массивтің өлшемін нақты сақталған элементтердің ағымдағы санына дейін азайтқыңыз келсе, trimToSize(). Топтамадан элементтерді алып тастағаннан кейін size()ол нақты бар элементтердің санын көрсетеді және capacityазаймайды! Айталық: біз 100 элементті енгіздік, алғашқы 50-ні жойдық, sizeол 50-ге тең болады, осылайша capacityол 100 болып қалады. Ал азайту үшін және , бізге бүкіл сыйымдылығымызды ағымдағы өлшемге реттейтін capacityәдісті қолдану керек . trimToSize()Ол қалай сәйкес келеді? Бос ұяшықтар қалмас үшін массивімізді көшіреді (жаңа массивтің ұзындығы өлшем өрісіне тең).
ArrayList класының егжей-тегжейлі талдауы [1-бөлім] - 8
Сіз сондай-ақ біздің коллекцияға элементтерді пайдалана аласыз addAll.
public boolean addAll(Collection< ? extends E> c)
public boolean addAll(int index, Collection< ? extends E> collection);
Бірінші опция әдіс параметрінде көрсетілген жинақтың барлық элементтерін (мысалы, басқа парақ) әдісті шақыру жасалған бастапқы жинаққа (соңында кірістіру) қосуға мүмкіндік береді. Өткізілген жинақ (ол жиын болуы мүмкін) көмегімен массивке түрлендіріледі toArray(). Әрине, қосу операциясы да көшіру арқылы жүзеге асырылады. Екіншісі - collectionindex бастап тізімге барлық элементтерді қосу index. Бұл жағдайда барлық элементтер тізімдегі элементтер саны бойынша оңға жылжиды collection. Элементтерді жою Алдымен, ArrayList тізімінен элементтерді жоюдың классикалық опцияларын қарастырайық.
public E remove(int index)
Индекс бойынша жоюды орындайды және барлық кейінгі элементтерді (көрсетілген индекстегі элементтен кейін) солға жылжытады, осылайша «саңылауларды» жабады. Ол сондай-ақ жойылған элементті (E) қайтарады, ол бұрын жою алдында қосымша айнымалыға жазылған, оның мәні біз әдісті шақыру нәтижесінде аламыз. E дегеннің не екенін түсіну үшін жалпы типтер деп аталатындармен танысу керек. E белгісі әдіс ArrayList нысанын жасау кезінде көрсетілген деректер түрін қайтаратынын көрсетеді (есіңізде болсын: List <String> list, тиісінше, бұл жағдайда E "алмастырылады" String). Жалпы түсіну үшін мен жалпы түрлермен танысуды ұсынамын. Енгізілген индекстің дұрыстығы тексеріледі, содан кейін әдіс ішінде элемент толығымен жойылмайды, бірақ жеке әдіс деп аталады fastRemove(Object[] es, int i), онда жою орын алады. Біз массив пен көрсетілген индексті енгізу ретінде әдіске береміз. Элементтер көмегімен көшіріледі System.arraycopy(), массив өлшемі кішірейеді, содан кейін соңғы элементке нөлді тағайындаймыз. Жаңа массив жасалмағанын атап өткен жөн: System.arraycopy(es, i + 1, es, i, size - 1 - i); Көрсетілген индекс (i+1) астындағы позицияның оң жағындағы бөлік біздің бастапқы массивке (es) көшіріледі және ол дәл осы позициядан бастап орналасқан. (i) жойылатын элементтің орналасқан жері. Осылайша, біз солға жылжу жасап, элементімізді өшірдік.
Подробный разбор класса ArrayList [Часть 1] - 9
Төмендегі массивтен 3 индексіндегі элементті алып тастауға тырысайық:
Подробный разбор класса ArrayList [Часть 1] - 10
Әдістің екінші нұсқасын қарастырайық:
public boolean remove(Object o)
Әдіс берілген элементті тізімнен o, дәлірек айтқанда, көрсетілген сілтемедегі нысанды жояды. Тізімде элемент бар болса, ол жойылады және барлық элементтер солға жылжытылады. Егер элемент тізімде бар болса және сәтті жойылса, әдіс шын мәнін қайтарады, әйтпесе жалған. Индекс бойынша жою опциясына ұқсас әдіс fastRemove(), дәл сол әрекеттер орындалатын жерде деп аталады. Айырмашылығы мынада, әдіс remove(Object o)қалаған нысанды equals()Object класының әдісі арқылы қосымша іздейді. Мән бойынша жою кезінде цикл сәйкестік табылғанша тізімнің барлық элементтерінен өтеді. Тек бірінші табылған элемент жойылады. Қорытындылаймыз: динамикалық массивтен элементтерді жою кезінде кәдімгі массивтегідей саңылаулар қалмайды (жойылған ұяшық бос болмайды). Барлық кейінгі элементтер (индекстің оң жағында болған) бір позицияға солға жылжытылады. Тізімнен элементтерді әртүрлі дәрежеде жою үшін қолдануға болатын бірнеше қосымша әдістер бар. Оларға қысқаша тоқталайық. Біздің топтаманы тазалау:
public void clear()
Қарапайым цикл forмассивтің барлық элементтерін қайталайды, әрбір элементке нөлді тағайындайды. Басқа тасымалданған жинақта қамтылған элементтерді біздің коллекциядан келесідей жоюға болады:
public boolean removeAll(Collection< ?> c)
Егер сізге бірнеше элементтерді жою қажет болса, оны шартты циклде орындамағаныңыз жөн: әдісті пайдалану ыңғайлырақ және қауіпсіз removeAll(). Ол тізімнен жойылатын элементтер жинағын қабылдайды. Жинақта мақсатты тізім сақтайтын бірдей түрдегі элементтер болуы керек. Әйтпесе ол лақтырылады ClassCastException. Тізім әдісті шақыру нәтижесінде өзгертілсе, әдіс шын мәнін қайтарады.
Подробный разбор класса ArrayList [Часть 1] - 11
Өткізілген жинаққа жатпайтын элементтерді жояды:
public boolean retainAll(Collection< ?> c)
Подробный разбор класса ArrayList [Часть 1] - 12
Бізде жинақ бар делік:
List< String> listFirst = new ArrayList<>();
listFirst.add("White");
listFirst.add("Black");
listFirst.add("Red");
Ал екіншісі:
List< String> listSecond = new ArrayList<>();
listSecond.add("Green");
listSecond.add("Red");
listSecond.add("White");
Содан кейін listSecond.retainAll(listFirst)in listSecond: қалады:

"White"
"Red"
«Жасыл» жойылғандықтан, ол ішінде жоқ listFirst. Бірақ listSecond.removeAll(listFirst)одан кейін ол listSecondқалады:

"Green"
Удалorсь все элементы, которые есть в listFirst.
Өткізілген жинаққа жатпайды - егер өткен жинақта жоқ элементтер болса, оларды біріншіден (әдіс қолданылатын) алып тастау керек дегенді білдіреді. Тасымалданған коллекцияға жататындығы – сәйкесінше, бірінші және екінші (берілген) жинақтарда да элемент болса, онда біріншіден алынған көшірме жойылады.
protected void removeRange(int fromIndex, int toIndex)
Тізімнен бастапқы көрсетілген индекс (қоса алғанда) мен соңғы көрсетілген индекс (қоса емес) арасындағы барлық элементтерді жояды. Айта кетейік, әдісті ArrayList нысанында тікелей шақыруға болмайды. Оны пайдалану үшін мұрагер болу керек AbstractList/ArrayList. Әдіс басқа әдіспен де қолданылады (кейінірек талқыланатын subList).
public boolean removeIf(Predicate< ? super E> filter)
Берілген предикат негізінде жинақтан элементтерді жояды. Предикаттың өзі белгілі бір функция/алгоритм/шарт, оның негізінде берілген шартқа сәйкес келетін бір немесе бірнеше элементтер жойылады. Predicate— функционалды интерфейс (бір ғана әдісті қамтиды, сондықтан оны лямбда ретінде пайдалануға болады), «бір параметр алынған - логикалық қайтарылған» принципі бойынша жұмыс істейді. Негізінде, әдіс интерфейстен іске асыруды жоққа шығарады Collectionжәне келесі «стратегияны» жүзеге асырады: ол элементтерді айналдырады және біздің Predicate; ол бірінші итерацияда белгіленген элементтерді жою (және ауыстыру) үшін екінші рет орындалады. PredicateЕкі нысан тең болса, шындықты қайтаратын интерфейсті іске асырайық :
class SamplePredicate< T> implements Predicate< T>{
  T varc1;
  public boolean test(T varc){
     if(varc1.equals(varc)){
       return true;
  }
  return false;
  }
}
StringБасқа сыныпта келесіден ArrayList және біздің сыныптың an objectісін жасайық Predicate:
ArrayList< String> color_list = new ArrayList<> ();
SamplePredicate< String> filter = new SamplePredicate<> ();
Айнымалыға varc1«Ақ» мәнін жазайық:
filter.varc1 = "White";
Тізімге бірнеше жолды қосамыз:
color_list.add("White");
color_list.add("Black");
color_list.add("Red");
color_list.add("White");
color_list.add("Yellow");
color_list.add("White");
Тізімдегі әдісті орындап көрейік removeIf, оған нысанымызды шартпен береміз:
color_list.removeIf(filter);
Нәтижесінде «Ақ» мәні бар барлық жолдар тізімнен жойылады, өйткені біздің «предикат» оларды теңдік үшін салыстырады. Қорытынды тізім: [Қара, Қызыл, Сары].
Подробный разбор класса ArrayList [Часть 1] - 13
Элементтерді ауыстыру
public E set(int index, E element)
Көрсетілген позициядағы элементті indexөткенмен ауыстырады element. Сондай-ақ индекс нөлден үлкен және соңғы элементтің индексінен аз болуы керек, әйтпесе ерекше жағдай шығарылады IndexOutOfBoundsException. Ішкі массивтің көшірмелері болмайды. Жай ғана, көрсетілген индекстегі элементтің орнына жаңа элемент енгізіледі, яғни. мәнді қайта жазу.
Подробный разбор класса ArrayList [Часть 1] - 14
public void replaceAll(UnaryOperator<e> operator)
Жинақтың барлық элементтерін өзгертеді (шартпен мүмкін). Көбінесе интерфейсті жүзеге асыратын және оның әдістерін анықтайтын ламбдалармен немесе анонимді класспен (бірақ түсінікті болу үшін мысалда интерфейсті жүзеге асыратын классты ғана қолданамыз) бірге қолданылады . UnaryOperatorИнтерфейсті іске асырамыз:
class MyOperator< T> implements UnaryOperator< T>{
   T varc1;
   public T apply(T varc){
     return varc1;
  }
}
StringБасқа сыныпта келесіден ArrayList және біздің сыныптың an objectісін жасайық UnaryOperator:
ArrayList< String> color_list = new ArrayList<> ();
MyOperator< String> operator = new MyOperator<> ();
Айнымалыға varc1«Ақ» мәнін жазайық:
operator.varc1 = "White";
Тізімге бірнеше жолды қосамыз:
color_list.add("White");
color_list.add("Black");
color_list.add("Red");
color_list.add("White");
color_list.add("Yellow");
color_list.add("White");
replaceAllТізімде нысанымызды беретін әдісті орындаймыз operator:
color_list.replaceAll(operator);
Нәтижесінде тізімдегі барлық мәндер «Ақ» мәніне ауыстырылды: [Ақ, Ақ, Ақ, Ақ, Ақ, Ақ]. Осылайша, мысалы, жинақтағы жолдардан барлық бос орындарды жоюға болады:
ArrayList< String> list = new ArrayList<>(Arrays.asList("A   ", "  B  ", "C"));
list.replaceAll(String::trim);
Басқа әдістер: ArrayList тізімінің массивін келесі әдіс арқылы кәдімгі массивке түрлендіруге болады:
public Object[] toArray()
немесе
public < T> T[] toArray(T[] a)
- мұнда қайтарылған массивтің түрі анықталады runtime Бұл әдіс мыналарға мүмкіндік береді:
  1. кейбір операцияларды жылдамdate;
  2. жиынды тікелей қабылдау үшін артық жүктелмеген әдіске параметр ретінде массивді беру;
  3. Жинаққа негізделген жаңа codeты жинақтарды танымайтын бұрынғы codeпен біріктіру.
Массивтің көшіру нысанын қайтарыңыз:
public Object clone()
Әдіс clone()нысан түрін қайтаратынын ескеріңіз, сондықтан оны шақырғаннан кейін қажетті сыныпқа трансляциялау қажет болады. Клондау жаңа тәуелсіз нысанды жасайды. Топтаманы нысанның бар-жоғын тексеріңіз:
public boolean contains(Object o)
Тізімде нысанның бар-жоғын тексереді (іште Object сыныбының equals әдісін пайдалану, яғни сілтемелерді салыстырады), нәтижеге байланысты ақиқат/жалған мәнін қайтарады. Кәдімгі циклдардан басқа, сіз коллекцияны қайталай аласыз (әр элементке қол жеткізу, сонымен қатар кейбір әрекеттерді орындау):
public void forEach(Consumer< ? super E> action)
Тізімді осылай көрсетуге болады:
List< Integer> numbers = new ArrayList<>(Arrays.asList(10, 20, 50, 100, -5));
numbers.forEach((number)-> System.out.println(number));
Lambdas қолданбай сіз анонимді классты пайдаланып, acceptинтерфейс әдісін қайта анықтауыңыз керек Consumer:
numbers.forEach(new Consumer< Integer>() {
  @Override
   public void accept(Integer integer) {
      System.out.println(integer);
          }
});
Элементті оның индексі бойынша алыңыз:
public E get(int index)
Коллекция элементтеріне кездейсоқ қол жеткізу үшін пайдаланылады. Көрсетілген индекстегі тізімде орналасқан элементті қайтарады. Тізімдегі элементтердің ең көп саны index < 0немесе болса , ерекше жағдай шығарылады . Бұл тізімнен элементті шығарып алудың негізгі әдісі және элементті индекс бойынша шығарып алу уақыты ArrayList өлшеміне қарамастан әрқашан бірдей болады, себебі ол белгілі бір жиым ұяшығына қатынасады. Көрсетілген нысандар үшін индекстерді табу: index >=IndexOutOfBoundsException
public int indexOf(Object o);
public int lastIndexOf(Object o);
Әдістер тізімдегі бірінші (берілген нысан бірінші рет кездескен кезде) немесе соңғы пайда болған (берілген нысан соңғы кездескен кезде) элементінің индексін қайтарады. Егер элемент тізімде жоқ болса, әдістер -1 қайтарады.
Подробный разбор класса ArrayList [Часть 1] - 16
Подробный разбор класса ArrayList [Часть 1] - 17
Элементтер үшін коллекцияны тексеріңіз:
public boolean isEmpty();
Тізім бос болса, әдіс "true" мәнін қайтарады (өріс тең екенін көреді size 0), әйтпесе "жалған". Тізімде тек бос элементтер болса, әдіс жалған мәнді қайтарады. Басқаша айтқанда, бұл әдіспен нөлдік элементтер де ескеріледі. Тізімдегі элементтердің санын табыңыз:
public int size();
Тізімдегі элементтердің санын қайтарады (өлшем өрісінің мәндері). Элементтердің саны тізім сыйымдылығынан (сыйымдылығынан) өзгеше болуы мүмкін. Тізім үшін итераторды алыңыз:
public Iterator< E> iterator();
Кейінірек циклде немесе кез келген басқа өңдеуде пайдалану үшін тізімге итераторды қайтарады. Итератор сәтсіз әрекетті жүзеге асырады. Егер ол жинақ арқылы өтіп, оған кейбір өзгертулерді байқаса (итератор әдістері арқылы алынбаған), ол бірден ерекше жағдайды шығарады ConcurrentModificationException. Итераторда деп аталатын нәрсе бар modification count. Итератор коллекция арқылы әрқайсысынан кейін қайталағанда next/hasNext/remove, ол осы есептегішті тексереді. Итератор көретін нәрсеге сәйкес келмесе, ол ерекше жағдайды шығарады. Мен мұнда итераторларды егжей-тегжейлі қарастырмаймын.
public ListIterator< E> listIterator() и public ListIterator< E> listIterator(int index)
Кейінірек циклде немесе кез келген басқа өңдеуде пайдалану үшін тізімге арналған тізім итераторын қайтарады. Интерфейс тізімді екі жақты өту және оның элементтерін өзгерту үшін ListIteratorинтерфейсті кеңейтеді . IteratorШамадан тыс жүктелген нұсқада сіз «ару» басталатын индексті бере аласыз. Бұл жағдайда индекс әдіс өз жұмысын бастайтын бірінші элементті білдіреді next()және әдіс шақырылған кезде previous()өту «өткен индекс - 1» индексінің астындағы элементтен басталады.
public Spliterator <E> spliterator()
Java 8 бөлгіш итератор деп аталатын кеш байланыстырудың және сәтсіздікке тез итератордың жаңа түрін ұсынады. Бөлгіш итераторлар элементтер тізбегі бойынша қайталауға мүмкіндік береді, бірақ олар басқа жолмен пайдаланылады. Spliterator интерфейсінің ең маңызды ерекшелігі - оның элементтер тізбегінің жеке бөліктерінің параллель итерациясын, демек, параллельді бағдарламалауды қолдау мүмкіндігі.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION