JavaRush /Блоги Java /Random-TG /Таҳлили муфассали синфи ArrayList [Қисми 1]
Vonorim
Сатҳи

Таҳлили муфассали синфи ArrayList [Қисми 1]

Дар гурӯҳ нашр шудааст
Ин мақола ба синфи ArrayList аз чаҳорчӯбаи Collections, ки шояд осонтарин фаҳмо бошад, аз сабаби он, ки он ба массиви муқаррарӣ асос ёфтааст, ба таври муфассал баррасӣ хоҳад кард. Дар мусоҳиба бешубҳа ба шумо дар бораи ин синф ва татбиқи он дар Java савол дода мешавад. Дар қисми дуюм мо усулҳои боқимондаро таҳлил хоҳем кард ва татбиқи худии массиви динамикиро барои рақамҳо нависед. Синфи ArrayList аз синфи AbstractList мерос мегирад ва интерфейсҳои зеринро амалӣ мекунад: List, RandomAccess, Cloneable, Serializable. Таҳлor муфассали синфи ArrayList [Қисми 2] Таҳлor муфассали синфи ArrayList [Қисми 1] - 1 Синфи ArrayList массивҳои динамикиро дастгирӣ мекунад, ки онҳоро дар ҳолати зарурӣ васеъ кардан мумкин аст. Зарурат ва самарабахшии он бо он шарњ дода мешавад, ки массиви муќаррарї дарозии собит дорад: пас аз сохтани он, вай наметавонад калон шавад ва ё хурд шавад, ки ин мањдудиятњоро ба миён меорад, агар маълум набошад, ки массив то чи андоза зарур аст. Аслан, синфи ArrayList як массиви рӯйхати дарозии тағирёбандаи истинодҳои an object мебошад. Фаҳмидани он муҳим аст, ки андозаи (шумораи ҳуҷайраҳо) массиви дохилӣ ҳангоми хориҷ кардани элементҳо аз он ба таври худкор кам намешавад. Дар асл, арзиши тағирёбанда size, ки шумораи унсурҳои воқеан дар массив мавҷудбударо нишон медиҳад, кам карда мешавад. Фарз мекунем, ки мо an objectи нави синфи ArrayList месозем ва ба он 5 элемент илова мекунем. Бо нобаёнӣ, массиви аз 10 элемент сохта мешавад. Дар ин ҳолат, иқтидори ба истилоҳ (андоза/ҳаҷм) an objectи мо ба 10 баробар хоҳад шуд, аммо арзиши тағирёбанда sizeба панҷ баробар хоҳад буд. Ва вақте ки мо элементҳоро нест мекунем, мо тағиротро дар арзиши тағирёбанда мебинем size, зеро мо .lengthнаметавонем ба массиви дохorи синфи ArrayList дастрасӣ пайдо кунем ва дарозии онро фаҳмем. Андозаро метавон бо истифода аз усули иловагӣ кам кард trimToSize(), ки баъдтар муҳокима хоҳад шуд. Биёед ба майдонҳои синф назар андозем.
  • Майдоне, ки барои ҳаҷми пешфарзии массиви динамикӣ масъул аст:

    private static final int DEFAULT_CAPACITY = 10

    Ҳангоми сохтани an objectи нав ArrayList<>() (конструктори бепараметр) дар дохor он массиви аз 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)– массиви рӯйхатро бо қобorяти ибтидоӣ эҷод мекунад. Агар параметри додашудаи initialCapacity аз 0 зиёд бошад, пас массиви андозаи муайяншуда сохта мешавад (ба майдони дохorи elementData пайванд ба массиви нави навъи Object бо андозаи initialCapacity таъин карда мешавад). Агар параметр 0 бошад, массиви холӣ сохта мешавад. Агар параметри муайяншуда аз 0 камтар бошад, он гоҳ IllegalArgumentException партофта мешавад.
Эҷоди an object
List < String> list = new ArrayList<>();
Объекти навтаъсис listдорои хосиятҳо (майдонҳо) elementDataва size. Захираи арзиш elementDataҷуз як массиви як навъи мушаххас (бо аломати умумӣ – <>) дар мавриди мо чизи дигаре нест String[]. Агар конструктори бидуни параметр даъват карда шавад, пас ба таври нобаёнӣ массиви аз 10 элементи навъи Object сохта мешавад (албатта бо cast ба намуд). Таҳлor муфассали синфи ArrayList [Қисми 1] - 2Илова кардани элементҳо Ба таври классикӣ илова кардани элементҳо ба массиви рӯйхат бо истифода аз вариантҳои изофабории add().
public boolean add(E элемент)
Хуб, биёед илова кунем: list.add("0"); Таҳлor муфассали синфи ArrayList [Қисми 1] - 3Дар дохor ин усул versionи изофабори метод add()номида мешавад, ки ҳамчун , ишора шудааст private, ки дар навбати худ се параметрро ҳамчун вуруд мегирад: элементи иловашуда, массиви дохилӣ ва андозаи он. Дар усули хусусӣ санҷиш сурат мегирад: агар параметри андозаи додашуда ба дарозии массиви дохилӣ баробар бошад (яъне массив пур аст), он гоҳ ба массив натиҷаи метод ( grow(int minCapacity)қимати ҷории майдон) таъин карда мешавад. size + 1 ба усул интиқол дода мешавад, зеро элементи иловашударо ба назар гирифтан лозим аст), ки дар дохor массив истинод ба массиви нави эҷодшуда таъин карда мешавад, ки тавассути нусхабардории элементҳои массиви аслӣ ба даст омадааст:
Arrays.copyOf(elementData, newCapacity(minCapacity))
Ҳамчун параметри дуюми усул, copyOfмо натиҷаи методро нишон медиҳем newCapacity(int minCapacity), ки дар дохor он андозаи массиви нав ҳисоб карда мешавад. Он бо истифода аз формулаи зерин ҳисоб карда мешавад: int newCapacity = oldCapacity + (oldCapacity >> 1) Барои массив бо андозаи пешфарз, инҳо дуруст хоҳанд буд: >> 1– як ба як ба бит гузариш ба тарафи рост (операторе, ки ададро то нисфи онро кам мекунад). Аслан, ин маънои тақсим кардани 2 ба қувваи 1-ро дорад. Маълум мешавад, ки мо 10-ро ба 2 тақсим мекунем ва 10-ро илова мекунем. Ҳамагӣ, иқтидори нави массив 15 аст, аммо азбаски мо элементи 11-ро илова мекунем, пас 15 + 1 = 16. Биёед ба рӯйхатамон баргардем ва фарз кунем, ки мо аллакай ба он 10 элемент илова кардаем ва кӯшиш мекунем, ки 11 элементро илова кунем. Санҷиш нишон медиҳад, ки дар массив ҷой холӣ нест. Мувофиқи он, массиви нав эҷод ва номида мешавад Arrays.copyOf, ки дар дохor он усули системаро истифода мебарад System.arraycopy(). Таҳлor муфассали синфи ArrayList [Қисми 1] - 4Таҳлor муфассали синфи ArrayList [Қисми 1] - 5Ё ин аст як мисоли равшан аз як мақолаи JavaRush: Таҳлor муфассали синфи 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). Ва танҳо пас аз он ба массиви дохилӣ дар индекси муқарраршуда як унсури нав илова карда мешавад. Азбаски мо як қисми массивро ба тарафи рост як маротиба иваз кардем (массиви нав сохта нашудааст), ячейкае, ки ба мо лозим аст, барои навиштан озод хоҳад буд. Пайванди массиви кӯҳна нест карда мешавад ва дар оянда онро ҷамъкунандаи ахлот ба ӯҳда мегирад. "Maserati" -ро ба ҳуҷайра [3], ки аллакай ишғол шудааст, часбонед:
Таҳлor муфассали синфи ArrayList [Қисми 1] - 7
Ҳамин тариқ, вақте ки элемент ба индекс ворид карда мешавад ва дар массив ҷойҳои холӣ вуҷуд надорад, занг System.arraycopy()ду маротиба сурат мегирад: якум дар grow(), дуюм дар худи усул add(index, value), ки ба суръати тамоми амалиёти иловакунӣ ба таври равшан таъсир мерасонад. Дар натиҷа, вақте ки ба массиви дохилӣ элементи дигар навиштан лозим аст, аммо дар он ҷо ҷой нест, дар дохor ArrayList чунин рӯй медиҳад:
  • Массиви нав бо андозаи 1,5 маротиба калонтар аз массиви аслӣ ва иловаи як элемент сохта мешавад.
  • Ҳама унсурҳои массиви кӯҳна ба массиви нав нусхабардорӣ карда мешаванд
  • Массиви нав дар тағирёбандаи дохorи an objectи ArrayList нигоҳ дошта мешавад ва массиви кӯҳна ахлот эълон карда мешавад.
Иқтидори an objectҳои навъи ArrayList метавонад ба таври дастӣ бо усули зерин зиёд карда шавад:
public void ensureCapacity(int minCapacity)
Бо зиёд кардани иқтидори массив пешакӣ, шумо метавонед баъдтар аз тақсимоти иловагии RAM пешгирӣ кунед. Ин усул андозаи массиви дохorро барои ҷойгир кардани шумораи элементҳои ба minCapacity. Усул ensureCapacity()ба майдон таъсир намерасонад size, он ба capacity(андозаи) массиви дохилӣ таъсир мерасонад. Бори дигар таъкид мекунам, ки sizeҳарду capacityчизҳои гуногунанд ва хеле муҳим аст, ки онҳоро омехта накунед! Агар шумо хоҳед, ки андозаи массиви асосие, ки аз он ArrayList сохта шудааст, то шумораи ҷории элементҳои воқеан захирашуда кам кунед, шумо бояд ба trimToSize(). Пас аз хориҷ кардани элементҳо аз коллексия, size()он шумораи унсурҳои воқеан мавҷудбударо нишон медиҳад ва capacityкам намешавад! Фарз мекунем: мо 100 элемент ворид кардем, 50-и аввалро нест кардем, sizeон ба 50 баробар мешавад ва аз ин рӯ capacity100 боқӣ мемонад. Барои кам кардан ва capacity, мо бояд усули ро истифода барем trimToSize(), ки тамоми иқтидори моро ба андозаи ҷорӣ мувофиқ мекунад. Он чӣ гуна мувофиқ аст? Массиви моро нусхабардорӣ мекунад, то ячейкаҳои холӣ намонанд (дарозии массиви нав танҳо ба майдони андоза баробар аст).
Таҳлor муфассали синфи ArrayList [Қисми 1] - 8
Шумо инчунин метавонед бо истифода аз addAll.
public boolean addAll(Collection< ? extends E> c)
public boolean addAll(int index, Collection< ? extends E> collection);
Варианти аввал ба шумо имкон медиҳад, ки ҳамаи элементҳоро аз коллексияи дар параметри метод нишондодашуда (масалан, варақи дигар) ба коллексияи аслӣ (дар охири ворид кунед), ки барои он даъвати метод анҷом дода шудааст, илова кунед. Коллексияи гузаронидашуда (он метавонад маҷмӯи бошад) бо истифода аз toArray(). Табиист, ки амалиёти иловакунӣ инчунин бо истифода аз нусхабардорӣ анҷом дода мешавад. Дуюм ин аст, ки ҳама элементҳоро collectionба рӯйхат аз index илова кунед index. Дар ин ҳолат, ҳамаи элементҳо аз рӯи шумораи элементҳои рӯйхат ба тарафи рост ҳаракат мекунанд collection. Хориҷ кардани унсурҳо Аввалан, биёед ба вариантҳои классикии нест кардани элементҳо аз ArrayList назар кунем.
public E remove(int index)
Ҳазфкуниро аз рӯи индекс анҷом медиҳад ва ҳамаи унсурҳои минбаъдаро (пас аз элемент дар индекси муайяншуда) ба тарафи чап мекӯчонад ва ба ин васила “сӯроҳҳоро” мебандад. Он инчунин унсури ҳазфшударо (E) бармегардонад, ки қаблан ба тағирёбандаи иловагӣ пеш аз ҳазф навишта шуда буд, ки арзиши онро мо дар натиҷаи даъвати метод ба даст меорем. Барои фаҳмидани он, ки E чист, шумо бояд бо намудҳои ба истилоҳ умумӣ шинос шавед. Нишонаи E нишон медиҳад, ки усул навъи маълумотеро, ки ҳангоми сохтани an objectи ArrayList муайян шуда буд, бармегардонад (дар хотир доред: List <String> listмувофиқан, дар ин ҳолат, E "ҷойгузин" мешавад String). Барои фаҳмиши умумӣ, ман сахт тавсия медиҳам, ки шумо бо намудҳои умумӣ шинос шавед. Дурустии индекси воридшуда санҷида мешавад ва баъд дар дохor усул, элемент пурра нест карда намешавад, аммо усули хусусӣ номида мешавад fastRemove(Object[] es, int i), ки дар он ҳазф аллакай рух медиҳад. Мо массив ва индекси муайяншударо ба усул ҳамчун вуруд мегузорем. Элементҳо бо истифода аз - нусхабардорӣ карда мешаванд System.arraycopy(), андозаи массив кам карда мешавад ва он гоҳ мо ба элементи охирин нул таъин мекунем. Бояд қайд кард, ки массиви нав сохта нашудааст: System.arraycopy(es, i + 1, es, i, size - 1 - i); Қисме, ки дар тарафи рости мавқеъ дар зери индекси муайяншуда (i+1) ҷойгир аст, ба массиви аслии мо (es) нусхабардорӣ карда мешавад ва он аз худи мавқеъ ҷойгир шудааст. (i) дар он ҷое, ки элемент бояд нест карда шавад. Ҳамин тариқ, мо ба чап гузаришро анҷом додем ва элементи худро тоза кардем.
Таҳлor муфассали синфи ArrayList [Қисми 1] - 9
Биёед кӯшиш кунем, ки элементи индекси 3-ро аз массиви зер хориҷ кунем:
Таҳлor муфассали синфи ArrayList [Қисми 1] - 10
Биёед варианти дуюми усулро дида бароем:
public boolean remove(Object o)
Усул элементи гузаштаро аз рӯйхат хориҷ мекунад o, ё дақиқтараш, an objectро дар истиноди муайяншуда. Агар элемент дар рӯйхат мавҷуд бошад, он хориҷ карда мешавад ва ҳамаи элементҳо ба тарафи чап гузаронида мешаванд. Агар элемент дар рӯйхат мавҷуд бошад ва бомуваффақият нест карда шавад, усул ҳақиқӣ бар мегардонад; дар акси ҳол, бардурӯғ. Монанди варианти ҳазф кардани индекс, метод ном дорад fastRemove(), ки дар он маҳз ҳамон амалҳо рух медиҳанд. Фарқият дар он аст, ки усул remove(Object o)ба таври илова an objectи дилхоҳро тавассути усули equals()синфи Object ҷустуҷӯ мекунад. Ҳангоми аз рӯи арзиш хориҷ кардан, ҳалқа аз тамоми унсурҳои рӯйхат то пайдо шудани мувофиқат мегузарад. Танҳо унсури аввалини ёфтшуда нест карда мешавад. Биёед ҷамъбаст кунем: ҳангоми нест кардани элементҳо аз массиви динамикӣ, мисли массиви муқаррарӣ сӯрохиҳо намемонанд (ячейкаи ҳазфшуда холӣ нахоҳад буд). Ҳама унсурҳои минбаъда (ки дар тарафи рости индекс буданд) як мавқеъ ба чап кӯчонида мешаванд. Якчанд усулҳои иловагӣ мавҷуданд, ки метавонанд барои хориҷ кардани элементҳо аз рӯйхат то дараҷаҳои гуногун истифода шаванд. Биёед ба онҳо мухтасар назар кунем. Тоза кардани коллексияи мо:
public void clear()
Давраи оддӣ forтавассути тамоми элементҳои массив такрор мешавад ва ба ҳар як элемент нул таъин мекунад. Шумо метавонед он унсурҳоро аз коллексияи мо хориҷ кунед, ки дар коллексияи дигари интиқолшуда мавҷуданд, ба монанди:
public boolean removeAll(Collection< ?> c)
Агар ба шумо лозим ояд, ки якчанд унсурҳоро нест кунед, шумо эҳтимол онро дар як ҳалқаи шартӣ иҷро накунед: истифодаи усул қулайтар ва бехатартар аст removeAll(). Он маҷмӯи элементҳоро қабул мекунад, ки аз рӯйхат хориҷ карда мешаванд. Маҷмӯа бояд унсурҳои ҳамон намудеро дар бар гирад, ки рӯйхати мақсаднок нигоҳ медорад. Дар акси ҳол он партофта мешавад ClassCastException. Агар рӯйхат дар натиҷаи даъвати метод тағир дода шуда бошад, усул ҳақиқӣ бармегардад.
Таҳлor муфассали синфи ArrayList [Қисми 1] - 11
Элементҳоеро, ки ба коллексияи гузашта тааллуқ надоранд, хориҷ мекунад:
public boolean retainAll(Collection< ?> c)
Таҳлor муфассали синфи 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)дар listSecondбоқӣ мемонад:

"White"
"Red"
Азбаски "Сабз" хориҷ карда шуд, ки дар listFirst. Аммо баъд аз listSecond.removeAll(listFirst)он listSecondбоқӣ мемонад:

"Green"
Удалorсь все элементы, которые есть в listFirst.
Тааллуқ надоштан ба коллексияи гузаронидашуда - маънои онро дорад, ки агар унсурҳое вуҷуд дошта бошанд, ки дар коллексияи гузашта нестанд, пас шумо бояд онҳоро аз аввалинаш хориҷ кунед (ба он усул татбиқ карда мешавад). Мансубият ба коллексияи интиқолшуда - мутаносибан, агар дар коллексияи якум ва дуюм (интиқолшуда) элемент мавҷуд бошад, он гоҳ нусхаи нусхаи якум нобуд карда мешавад.
protected void removeRange(int fromIndex, int toIndex)
Ҳама унсурҳоро аз рӯйхат хориҷ мекунад, ки дар байни шохиси ибтидоии муайяншуда (бо назардошти) ва индекси охири муайяншуда (на фарогир) ҷойгиранд. Бояд қайд кард, ки методро мустақиман дар an objectи ArrayList даъват кардан мумкин нест. Барои истифода бурдани он, шумо бояд аз AbstractList/ArrayList. Ин усул инчунин бо усули дигар истифода мешавад (subList, ки баъдтар баррасӣ мешавад).
public boolean removeIf(Predicate< ? super E> filter)
Элементҳоро аз коллексия дар асоси предикати додашуда хориҷ мекунад. Худи предикат як функсия/алгоритм/шарти муайяне мебошад, ки дар асоси он як ё якчанд элементҳои ба шарти додашуда хориҷ карда мешаванд. Predicate— интерфейси функсионалӣ (танҳо як усулро дар бар мегирад, бинобар ин онро ҳамчун ламбда истифода бурдан мумкин аст), аз рӯи принсипи "як параметр гирифта шуд - логики баргардонидашуда" кор мекунад. Аслан, усул татбиқро аз интерфейс барҳам медиҳад Collectionва "стратегия"-и зеринро амалӣ мекунад: он тавассути элементҳо давр мезанад ва онҳоеро, ки ба мо мувофиқат мекунанд, қайд мекунад Predicate; он гоҳ бори дуюм барои нест кардан (ва иваз кардани) унсурҳое, ки дар такрори аввал қайд карда шудаанд, иҷро карда мешавад. Биёед интерфейсеро амалӣ кунем Predicate, ки агар ду an object баробар бошанд, ҳақиқиро бармегардонад:
class SamplePredicate< T> implements Predicate< T>{
  T varc1;
  public boolean test(T varc){
     if(varc1.equals(varc)){
       return true;
  }
  return false;
  }
}
Дар синфи дигар, биёед як ArrayList аз Stringва 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, ки ба он an objectи худро бо шарти зерин мегузорем:
color_list.removeIf(filter);
Дар натиҷа, ҳамаи сатрҳои дорои арзиши "Сафед" аз рӯйхат хориҷ карда мешаванд, зеро "предикат"-и мо онҳоро барои баробарӣ муқоиса мекунад. Рӯйхати ниҳоӣ: [Сиёҳ, Сурх, Зард].
Таҳлor муфассали синфи ArrayList [Қисми 1] - 13
Иваз кардани элементҳо
public E set(int index, E element)
Элементро дар мавқеъи муайяншуда indexбо ҷои гузашта иваз мекунад element. Индекс инчунин бояд аз сифр бузургтар ва камтар аз шохиси элементи охирин бошад, дар акси ҳол истисно партофта мешавад IndexOutOfBoundsException. Нусхаи массиви дохилӣ вуҷуд надорад. Ба ҷои ин, ба ҷои элементи индекси муайяншуда, элементи нав ворид карда мешавад, яъне. арзишро аз нав нависед.
Таҳлor муфассали синфи 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;
  }
}
Дар синфи дигар, биёед як ArrayList аз Stringва 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ки ба он an objectи худро интиқол медиҳем 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. суръат бахшидан ба баъзе амалиётҳо;
  2. массивро ҳамчун параметр ба усуле гузаронед, ки барои қабули коллексия аз ҳад зиёд бор намекунад;
  3. Интегратсияи codeи нав дар асоси коллексия бо рамзи кӯҳна, ки коллексияҳоро эътироф намекунад.
Баргардонидани an objectи нусхабардории массив:
public Object clone()
Лутфан қайд кунед, ки усул clone()намуди Объектро бармегардонад, бинобар ин пас аз занг задан ба шумо лозим меояд, ки ба синфи зарурӣ интиқол диҳед. Клонкунӣ an objectи нави мустақилро эҷод мекунад. Маҷмӯаро барои мавҷудияти an object тафтиш кунед:
public boolean contains(Object o)
Мавҷудияти an objectро дар рӯйхат тафтиш мекунад (бо истифода аз усули баробарии синфи Object, яъне муқоисаи истинодҳо), вобаста ба натиҷа ҳақиқӣ/дурӯғро бармегардонад. Илова ба ҳалқаҳои муқаррарӣ, шумо метавонед коллексияро бо истифода аз такрори такрорӣ (дастрасӣ ба ҳар як элемент ва инчунин баъзе амалҳо) иҷро кунед:
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ё index >=шумораи максималии элементҳо дар рӯйхат бошад, истисно партофта мешавад IndexOutOfBoundsException. Ин усули асосии дарёфти элемент аз рӯйхат аст ва вақти дарёфти элемент аз рӯи индекс, новобаста аз андозаи ArrayList, ҳамеша як хел хоҳад буд, зеро он ба ячейкаи массиви мушаххас дастрасӣ дорад. Ҷустуҷӯи индексҳо барои an objectҳои мушаххас:
public int indexOf(Object o);
public int lastIndexOf(Object o);
Усулҳо шохиси элементи аввалро (вақте ки an objectи додашуда бори аввал дучор мешавад) ё охирин ҳодиса (вақте ки an objectи додашуда охирин дучор мешавад) дар рӯйхат бармегардад. Агар элемент дар рӯйхат мавҷуд набошад, усулҳо -1-ро бармегардонанд.
Таҳлor муфассали синфи ArrayList [Қисми 1] - 16
Таҳлor муфассали синфи ArrayList [Қисми 1] - 17
Маҷмӯаро барои элементҳо тафтиш кунед:
public boolean isEmpty();
Агар рӯйхат холӣ бошад, усул ҳақиқӣ бар мегардонад (мебинад, ки майдон баробар аст 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гузариши дуҷонибаи рӯйхат ва тағир додани унсурҳои он васеъ мекунад. Дар versionи изофаборшуда шумо метавонед индексеро гузаронед, ки аз он “гузариш” оғоз мешавад. Индекс дар ин ҳолат унсури аввалинеро, ки метод аз он ба кор оғоз мекунад next(), ифода мекунад ва вақте ки метод даъват карда мешавад, previous()гузаргоҳ аз элементи зери шохиси "индекси гузашта - 1" оғоз мешавад.
public Spliterator <E> spliterator()
Java 8 як навъи нави итератори дер ҳатмӣ ва ноком-тезро муаррифӣ мекунад, ки итератори ҷудокунанда номида мешавад. Итераторҳои ҷудокунанда ба шумо имкон медиҳанд, ки пайдарпайии элементҳоро такрор кунед, аммо онҳо бо тарзи дигар истифода мешаванд. Муҳимтарин хусусияти интерфейси Spliterator қобorяти он барои дастгирии итератсияи мувозии қисмҳои алоҳидаи пайдарпаии элементҳо ва аз ин рӯ барномасозии параллелӣ мебошад.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION