JavaRush /Java blogi /Random-UZ /Rasmlardagi Java ArrayList

Rasmlardagi Java ArrayList

Guruhda nashr etilgan
Salom! Bugungi ma'ruza ArrayListavvalgilariga qaraganda bir tomondan sodda bo'lsa, ikkinchi tomondan qiyinroq bo'ladi. Rasmlardagi ishchi massivlar ro'yxati - 1Bu qiyinroq, chunki bugun biz "kaput ostida" qaraymiz ArrayListva operatsiyalar paytida u bilan nima sodir bo'lishini o'rganamiz. Boshqa tomondan, bu ma'ruzada deyarli hech qanday kod bo'lmaydi - asosan rasmlar va tushuntirishlar. Shunday qilib, ketaylik :) Siz allaqachon bilganingizdek, ArrayList"a" ichida ma'lumotlar ombori vazifasini bajaradigan oddiy massiv mavjud. Ko'pgina hollarda, biz ro'yxatning aniq hajmini ko'rsatmaymiz. Lekin ichki massiv biroz o'lchamga ega bo'lishi kerak! Ha shunaqa. Uning standart hajmi [10] dir .
public static void main(String[] args) {
   ArrayList<Car> cars = new ArrayList<>();
}
Rasmlardagi ishchi massivlar ro'yxati - 2Birinchidan, yangi element qo'shish qanday ko'rinishini ko'rib chiqaylik. Avvalo, ichki massivda yetarli joy bor-yo'qligi va yana bitta element sig'ishi tekshiriladi . Agar bo'sh joy bo'lsa, yangi element ro'yxatning oxiriga qo'shiladi. "Oxirigacha" deganda biz massivning oxirgi katakchasini nazarda tutmaymiz (bu g'alati bo'lardi). Bu oxirgi joriy element yonidagi katakka ishora qiladi. Uning indeksi ga teng bo'ladi cars.size(). Bizning ro'yxatimiz hozir bo'sh ( cars.size() = 0). Shunga ko'ra, indeksli hujayraga yangi element qo'shiladi 0.
ArrayList<Car> cars = new ArrayList<>();
Car ferrari = new Car("Ferrari 360 Spider");
cars.add(ferrari);
Rasmlardagi ishchi massivlar ro'yxati - 3Bu erda hamma narsa aniq. Agar kiritish o'rtada, ya'ni bir nechta elementlar orasida amalga oshirilsa nima bo'ladi?
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, которая уже занята
}
Shunga qaramay, u birinchi navbatda massivda etarli joy mavjudligini tekshiradi. Agar bo'sh joy etarli bo'lsa, elementlar biz yangi elementni joylashtirgan hujayradan boshlab o'ngga siljiydi . Indeks 1 bo'lgan katakchaga joylashtiramiz. Ya'ni 3-yacheykadagi element 4-yacheykaga, 2-element 3-yacheykaga, 1-element 2-yacheykaga ko'chiriladi. Rasmlardagi ishchi massivlar ro'yxati - 4Shundan so'ng yangi elementimiz o'z joyiga yopishtiriladi. Oldingi element ( bugatti) allaqachon u yerdan yangi joyga ko'chirilgan. Rasmlardagi ishchi massivlar ro'yxati - 5Endi massivga kiritish uchun joy bo‘lmasa, bu jarayon qanday sodir bo‘lishini aniqlaymiz. Rasmlardagi ishchi massivlar ro'yxati - 6Birinchidan, albatta, etarli joy mavjudligini tekshirish uchun tekshiruv o'tkaziladi. Agar bo'sh joy yetarli emasligi aniqlansa, ArrayList'a ichida yangi o'lchamli massiv (OldArray * 1,5 o'lchami) + 1 yaratiladi.Bizning holimizda yangi massiv 16 katak o'lchamiga ega bo'ladi. Barcha joriy elementlar darhol u erda nusxalanadi. Rasmlardagi ArrayList ishi - 7Eski massiv axlat yig'uvchi tomonidan o'chiriladi va faqat yangi, kengaytirilgani qoladi. Endi yangi element uchun bo'sh joy mavjud. Biz uni egallagan 3-hujayraga joylashtiramiz. Endi tanish protsedura boshlanadi. 3-indeksdan boshlanadigan barcha elementlar bitta katakcha o'ngga siljiydi va yangi element jimgina qo'shiladi. Rasmlardagi ishchi massivlar ro'yxati - 8Va endi kiritish muvaffaqiyatli bo'ldi! Biz qo'shishni tartibladik. Endi elementlarni olib tashlash haqida gapiraylik . Esingizda bo'lsa, massivlar bilan ishlashda biz muammoga duch keldik: biz ularni o'chirib tashlaganimizda, unda "teshiklar" qoldi. Yagona yechim elementlarni har safar oʻchirilganda chapga siljitish edi va siz oʻzgartirish kodini oʻzingiz yozishingiz kerak edi. ArrayListxuddi shu printsip asosida ishlaydi, lekin unda bu mexanizm allaqachon avtomatik ravishda amalga oshirilgan. Rasmlardagi ishchi massivlar ro'yxati - 9Bu shunday ko'rinadi: Rasmlardagi ishchi massivlar ro'yxati - 10Va oxirida biz kerakli natijaga erishamiz: Rasmlardagi ishchi massivlar ro'yxati - 11element lambomuvaffaqiyatli o'chirildi. Bu erda biz o'rtadan olib tashlashni amalga oshirdik. Ro'yxat oxiridan o'chirish tezroq bo'lishi aniq, chunki kerakli element qolganlarini almashtirmasdan o'chiriladi. Keling, ichki massivning o'lchamini va uni xotirada saqlashni yana bir ko'rib chiqaylik. Massivni kengaytirish - ma'lum miqdordagi resurslarni talab qiladigan jarayon. ArrayListShuning uchun, agar siz kamida 100 ta elementga ega bo'lishini aniq bilsangiz, standart o'lcham bilan yaratmasligingiz kerak . 100-elementni qo'shguningizcha, ichki massiv har safar barcha elementlarni o'tkazgan holda 6 marta kengayadi.
  • 10 ta elementdan 16 tagacha
  • 16 elementdan 25 tagacha
  • 25 dan 38 gacha
  • 38 dan 58 gacha
  • 58 dan 88 gacha
  • 88 dan 133 gacha (formula bo'yicha (eski massivning o'lchami * 1,5) + 1)
Tabiiyki, bu resurslar nuqtai nazaridan ancha qimmat. Shuning uchun, agar siz saqlangan elementlarning bir nechta (hech bo'lmaganda taxminan) sonini bilsangiz, darhol ma'lum o'lchamdagi massiv bilan ro'yxatni yaratish yaxshiroqdir:
ArrayList<Car> cars = new ArrayList<>(100);
Endi 100 ta elementdan iborat massiv zudlik bilan xotiraga ajratiladi, bu esa yanada samaraliroq bo'ladi, chunki kengaytirishga resurslar behuda sarflanmaydi. Tanganing boshqa tomoni ham bor. Ob'ektlar ichki massivdan olib tashlanganida ArrayList, o'lcham avtomatik ravishda kamaymaydi. Masalan, bizda ArrayListto'liq to'ldirilgan 88 ta elementdan iborat ichki massiv mavjud: Rasmlardagi ishchi massivlar ro'yxati - 13Dasturning ishlashi davomida biz undan 77 ta elementni olib tashlaymiz va unda faqat 11 tasi qoladi: Rasmlardagi ishchi massivlar ro'yxati - 14Muammo nima ekanligini oldindan bilib oldingizmi? Xotiradan samarasiz foydalanish, albatta! Biz faqat 11 ta hujayradan foydalanamiz, shu bilan birga bizda 88 ta element uchun xotira ajratilgan - bu bizga kerak bo'lgandan 8 baravar ko'p! Bu holda optimallashtirishni amalga oshirish uchun siz maxsus sinf usulidan foydalanishingiz mumkin ArrayList- trimToSize(). U ichki massivning uzunligini hozirda saqlangan elementlar soniga "kesadi". Rasmlardagi ishchi massivlar ro'yxati - 15Endi kerakli darajada xotira ajratiladi! :)
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION