1. ArrayList qanday tuzilgan
ArrayList — Java'da elementlarni saqlash uchun eng ko'p ishlatiladigan sinf. Xo'sh, bu ArrayList qanday tuzilgan va nima uchun hammaga yoqadi?
ArrayList ning tuzilishi o'z mohiyatida sodda va ajoyibdir. Har bir ArrayList obyektining ichida ikkita maydon bor:
- Elementlar ro'yxati bo'lgan massiv
- Ro'yxatdagi elementlar sonini saqlaydigan
sizeo'zgaruvchisi
ArrayList obyektining ichida oddiy massiv bor! Ammo faqatgina emas. U yerda yana size degan o'zgaruvchi bo'lib, ro'yxatning uzunligini saqlaydi. Bu qanday ishlaydi:
Ishni boshlaganimizda, ro'yxatning ichidagi massiv uzunligi — 10 element. Va size o'zgaruvchisi 0 ga teng.
Agar ro'yxatga element qo'shsangiz, u massivning 0-indeksidagi joyga saqlanadi va size 1 ga oshadi.
Agar yana bir element qo'shsangiz, u massivning 1-indeksidagi joyga saqlanadi va size yana 1 ga oshib, ikki bo'ladi.
Agar yangi element qo'shilayotgan vaqtda massivda joy qolmasa, add() metodida quyidagi ishlar sodir bo'ladi:
- yangi massiv yaratiladi, oldingisidan bir yarim barobar uzunroq
- unga bor bo'lgan barcha elementlar mavjud massivdan ko'chiriladi
ArrayListobyektida eski massiv o'rniga yangi massivga havola saqlanadi.- Yangi massivning 10-indeksidagi joyga berilgan element yoziladi
- size 1 ga oshadi va u endi 11 bo'ladi
Ro'yxatdan o'rtasiga element qo'shganda (kiritganda) ham shunday. Mavjud elementlar 1 o'ngga suriladi va massivdagi bo'sh joyga kerakli element yoziladi.
Ro'yxatning eng asosiy foydalanish senariylarini ko'rib chiqamiz:
2. ArrayList ga element qo'shish
Keling, ro'yxat ichida sodir bo'layotgan narsalarni, unga elementlar qo'shilganda tushunib olamiz. ArrayList obyekti yaratganimizdan so'ng, xotirada quyidagicha tasvir paydo bo'ladi:

Bizda ArrayList tipidagi obyekt bor, uning ichida ikkita maydon (ikkita o'zgaruvchi) mavjud: massiv (data) va elementlar soni (size). data 10 elementli konteynerga (massivga) havolani saqlab turadi.
Agar biz massivga sonni 5 qo'shishga qaror qilsak, tasvir quyidagicha bo'ladi:

Massivda endi 5 elementi saqlangan, va size == 1 degan o'zgaruvchi mavjud.
Agar hozirda kimdir ArrayList obyektimizdan size() metodini chaqirsa, u ro'yxatdagi elementlar sonini oladi — 1. Ro'yxatdagi elementlar soni — bu massivning hajmi emas.
Massivning haqiqiy hajmi ham, o'zi ham hech qachon ArrayList obyekti tashqarisida mavjud bo'lmaydi (ko'rinmaydi). Bu ArrayList ning ichki ma'lumotlari, va ular har doim shunday bo'lib qoladi.
Keling, ro'yxatga yana 7 ta son qo'shamiz: 10, 20, 30, 40, 50, 60, 70.
Xotirada tasvir endi quyidagicha bo'ladi:

Agar hozirda size() metodini chaqirsak, u 8 raqamini qaytaradi — ro'yxatdagi yangi elementlar soni. Bu massivning hajmiga hech qanday aloqasi yo'q.
Bu rasmda bitta noaniqlik bor.
ArrayList sinfi primitiv turlarni saqlay olmaydi, shuning uchun int turi o‘rniga Integer turini ishlatadi. Konteyner 5-70 qiymatlarini emas, balki Integer turidagi obyektlarga havolalarni saqlaydi. Konteynerning barcha bo'sh joylari null ni saqlaydi.
3. Ro'yxat uzunligini oshirish
Keling, massivda bo'sh joylar tugagan paytda, ro'yxat ichida nima sodir bo'lishini ko'rib chiqaylik.
Aytaylik, bizda 10 ta elementli ro'yxat bor edi:

Biz unga 100 sonini qo'shishga qaror qildik, add() metodida quyidagi ishlar sodir bo'ladi:
1-qadam — yangi massiv yaratish:

2-qadam — eski massivdan yangi massivga barcha elementlarni nusxalash:

3-qadam — massivni almashtirish (ArrayList obyektining ichidagi massivga havolani o'zgartirish):

4-qadam — yangi sonni qo'shish, buning uchun biz ko'p ishladik:

GO TO FULL VERSION