JavaRush /Java блогу /Random-KY /Сүрөттөрдөгү Java ArrayList

Сүрөттөрдөгү Java ArrayList

Группада жарыяланган
Салам! Бугунку лекция ArrayListмурдагыларга Караганда бир жагынан женекей, экинчи жагынан кыйыныраак болот. Сүрөттөгү жумушчу ArrayList - 1Бул кыйыныраак, анткени бүгүн биз "капоттун астына" карап ArrayList, операциялар учурунда ага эмне болорун изилдейбиз. Экинчи жагынан, бул лекцияда дээрлик эч кандай code болбойт - көбүнчө сүрөттөр жана түшүндүрмөлөр. Ошентип, кетели :) Сиз билгендей, " ArrayLista" ичинде маалымат сактагычтын ролун аткарган кадимки массив бар. Көпчүлүк учурларда, биз тизменин так өлчөмүн тактабайбыз. Бирок ички массив кандайдыр бир өлчөмдө болушу керек! Бул чыныгы. Анын демейки өлчөмү [10] болуп саналат .
public static void main(String[] args) {
   ArrayList<Car> cars = new ArrayList<>();
}
Сүрөттөгү жумушчу ArrayList - 2Биринчиден, жаңы элементти кошуу кандай болорун карап көрөлү. Биринчиден, ички массивде орун жетиштүүбү же дагы бир элемент туура келеби же жокпу текшерилет . Эгер бош орун болсо, жаңы элемент тизменин аягына кошулат. Биз "аягына чейин" деп айтканда, массивдин акыркы уячасын билдирбейбиз (бул кызыктай болот). Бул акыркы учурдагы элементтин жанындагы уячага тиешелүү. Анын индекси барабар болот cars.size(). Биздин тизме азыр бош ( cars.size() = 0). Демек, индекси бар уячага жаңы элемент кошулат 0.
ArrayList<Car> cars = new ArrayList<>();
Car ferrari = new Car("Ferrari 360 Spider");
cars.add(ferrari);
Сүрөттөгү жумушчу ArrayList - 3Бул жерде баары түшүнүктүү. Кыстаруу ортодо, башкача айтканда, бир нече элементтердин ортосунда жүргүзүлсө эмне болот?
public static void main(String[] args) {
   ArrayList<Car> cars = new ArrayList<>();
   Car ferrari = new Car("Ferrari 360 Spider");
   Car bugatti = new Car("Bugatti Veyron");
   Car lambo = new Car("Lamborghini Diablo");
   Car ford = new Car("Ford Modneo");

   cars.add(ferrari);
   cars.add(bugatti);
   cars.add(lambo);

   cars.add(1, ford);//добавляем ford в ячейку 1, которая уже занята
}
Дагы, ал алгач массивде жетиштүү орун бар же жок экенин текшерет. Эгерде орун жетиштүү болсо, элементтер жаңы элементти киргизген уячадан баштап оңго жылдырылат . Индекс 1 болгон уячага чаптайбыз. Башкача айтканда, 3-уячанын элементи 4-уячага, 2-элемент 3-уячага, 1-элемент 2-уячага көчүрүлөт. Сүрөттөгү жумушчу ArrayList - 4Андан кийин биздин жаңы элементибиз ордуна чапталат. Мурунку элемент ( bugatti) ал жерден жаңы жерге көчүрүлгөн. Сүрөттөгү жумушчу ArrayList - 5Эми массивге киргизүү үчүн бош орун болбосо, бул процесс кандай болорун аныктап көрөлү. Сүрөттөрдөгү жумушчу ArrayList - 6Биринчиден, албетте, жетиштүү орун бар-жогу текшерилет. Эгерде орун жетишсиз болуп чыкса, анда ArrayList'a ичинде жаңы өлчөмдүү массив түзүлөт (OldArray * 1.5 өлчөмү) + 1 Биздин учурда, жаңы массив 16 уячанын өлчөмүнө ээ болот. Учурдагы бардык элементтер ошол замат ошол жерге көчүрүлөт. Сүрөттөгү ArrayList иши - 7Эски массив таштанды жыйноочу тарабынан жок кылынат жана жаңы, кеңейтилген массив гана калат. Эми жаңы элемент үчүн бош орун бар. Биз аны ээлеген 3-уячага чаптайбыз. Эми тааныш proceduresа башталат. 3 индексинен башталган бардык элементтер бир уячага оңго жылдырылат жана жаңы элемент акырын кошулат. Сүрөттөгү жумушчу ArrayList - 8Эми киргизүү ийгorктүү болду! Биз киргизүүнү иреттеп алдык. Эми элементтерди алып салуу жөнүндө сүйлөшөлү . Эсиңизде болсо, массивдер менен иштөөдө биз көйгөйгө туш болгонбуз: аларды жок кылганда, анда “тешиктер” калган. Элементтер жок кылынган сайын солго жылдыруу жалгыз чечим болгон жана сиз нөөмөттүн codeун өзүңүз жазышыңыз керек болчу. ArrayListошол эле принцип боюнча иштейт, бирок анда бул механизм автоматтык түрдө ишке ашырылган. Сүрөттөгү жумушчу ArrayList - 9Бул ушундай көрүнөт: Сүрөттөгү жумушчу ArrayList - 10Акыр-аягы, биз каалаган натыйжаны алабыз: Сүрөттөгү жумушчу ArrayList - 11Элемент lamboийгorктүү жок кылынды. Бул жерде биз ортодон алып салуу жасадык. Тизменин аягынан өчүрүү тезирээк болору түшүнүктүү, анткени керектүү элемент калгандарынын баарын жылдырбастан алынып салынат. Ички массивдин өлчөмүн жана анын эстутумда сакталышын дагы бир жолу карап көрөлү. Массивди кеңейтүү - бул белгилүү бир көлөмдөгү ресурстарды талап кылган процесс. Ошондуктан, демейки өлчөм менен түзбөшүңүз керек, ArrayListэгерде анын кеминде 100 элементи бар экенин так билсеңиз. 100-элементти киргизүүгө жеткенде, ички массив 6 эсе кеңейет , ар бир жолу бардык элементтерди өткөрүп берет.
  • 10 элементтен 16га чейин
  • 16 элементтен 25ке чейин
  • 25тен 38ге чейин
  • 38ден 58ге чейин
  • 58ден 88ге чейин
  • 88ден 133кө чейин (формула боюнча (Эски массивдин өлчөмү * 1,5) + 1)
Албетте, бул ресурстар жагынан абдан кымбат. Ошондуктан, эгер сиз сакталган элементтердин кээ бир (жок дегенде болжолдуу) санын билсеңиз, дароо белгилүү бир өлчөмдөгү массив менен тизме түзүңүз:
ArrayList<Car> cars = new ArrayList<>(100);
Эми 100 элементтен турган массив эстутумда дароо бөлүштүрүлөт, бул натыйжалуураак болот, анткени ресурстарды кеңейтүүдө текке кетпейт. Монетанын экинчи жагы да бар. Объекттер ички массивден алынып салынганда ArrayList, өлчөмү автоматтык түрдө кичирейбейт. Мисалы, бизде ArrayList88 элементтен турган ички массив бар, ал толугу менен толтурулган: Сүрөттөгү жумушчу ArrayList - 13Программанын иштөө учурунда биз андан 77 элементти алып салабыз жана анда 11 гана калды: Сүрөттөгү жумушчу ArrayList - 14Сиз көйгөй эмнеде экенин билесизби? Эстутумду натыйжасыз пайдалануу, албетте! Биз болгону 11 уячаны колдонобуз, ал эми эс тутумубуз 88 элементке бөлүнгөн - бул бизге керектүүдөн 8 эсе көп! Бул учурда оптималдаштыруу жүргүзүү үчүн, сиз атайын класс ыкмасын колдоно аласыз ArrayList- trimToSize(). Ал ички массивдин узундугун учурда анда сакталган элементтердин санына чейин "кесет". Сүрөттөгү жумушчу ArrayList - 15Азыр канча эс керек болсо, ошончолук бөлүнөт! :)
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION