MERHABA! Bugünün konusu,
İlk olarak, yeni öğeler eklemenin nasıl bir şey olduğunu görelim. İlk iş sırası, dahili dizinin dahili dizide yeterli alana sahip olup olmadığını ve bir öğenin daha sığıp sığmayacağını kontrol etmektir. Boşluk varsa, yeni eleman listenin sonuna eklenir. "Sonuna kadar" derken, dizideki son konumu kastetmiyoruz (bu garip olurdu). Son geçerli öğeyi takip eden konumu kastediyoruz. Endeksi olacaktır
Bu yeterince açık. Ortaya, yani diğer elemanların arasına eklersek ne olur?
yeni elemanımız yerine yerleştiriliyor. Önceki öğe (bugatti) zaten oradan yeni bir konuma kopyalanmıştır.
Şimdi diziye yeni elemanlar eklenecek yerler yoksa bu işlemin nasıl gerçekleştiğine bakalım.
Doğal olarak, önce yeterli alan olup olmadığını görmek için bir kontrol yapılır. Yeterli alan yoksa, içinde yeni bir dizi oluşturulur.
Eski dizi, çöp toplayıcı tarafından silinecek ve yalnızca yeni, genişletilmiş dizi kalacaktır. Şimdi yeni bir unsur için yer var. Dolu olan 3. pozisyona yerleştiriyoruz. Şimdi tanıdık prosedür başlıyor. Dizin 3'ten başlayarak tüm öğeler bir konum sağa kaydırılır ve yeni öğe sessizce eklenir.
Ve ekleme yapılır! Ve yerleştirmeyi bitirdik. Şimdi öğeleri kaldırmaktan bahsedelim . Dizilerle çalışırken bir sorunla karşılaştığımızı hatırlayacaksınız: öğeleri kaldırmak dizide "delikler" açar.her kaldırmada ve bu vardiyayı gerçekleştirmek için her seferinde kendi kodumuzu yazmamız gerekiyordu. ArrayList aynı prensibi izler, ancak bu mekanizmayı zaten uygular.
Görünüşü şöyle:
Ve sonunda istediğimizi elde ediyoruz:
Öğe
Program çalışırken 77 öğeyi kaldırdık, yani geriye yalnızca 11 öğe kaldı:
Sorunun ne olduğunu zaten tahmin ettiniz mi? Anladınız, belleğin verimsiz kullanımı! Burada yalnızca 11 konum kullanıyoruz, ancak 88 öğe için bellek ayırdık. İhtiyacımızdan 8 kat daha fazla!
Şimdi sadece ihtiyacımız kadar bellek ayırdık! :)
ArrayList
önceki derslerden hem daha kolay hem de daha zor olacak.

ArrayList
Daha zor olacak çünkü bugün çeşitli operasyonlar sırasında neler olduğunu inceleyeceğiz ve inceleyeceğiz. Öte yandan bu derste neredeyse hiç kod olmayacak. Çoğunlukla resimler ve açıklamalar. Pekala, başlayalım :) Bildiğiniz gibi, ArrayList
içinde sıradan bir dizi var ve bu bir veri deposu görevi görüyor. Çoğu durumda, listenin tam boyutunu belirtmeyiz. Ancak dahili dizinin bir boyutu olmalı! Ve öyle de oluyor. Varsayılan boyutu 10'dur .
public static void main(String[] args) {
ArrayList<Car> cars = new ArrayList<>();
}

cars.size()
. Listemiz şu anda boş ( cars.size() == 0
). Buna göre, yeni eleman 0 konumuna eklenecektir.
ArrayList<Car> cars = new ArrayList<>();
Car ferrari = new Car("Ferrari 360 Spider");
cars.add(ferrari);

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);// add ford to cell 1, which is already occupied
}
Yine önce dizide yeterli alan olup olmadığı kontrol edilir. Yeterli boşluk varsa, yeni öğeyi eklediğimiz konumdan başlayarak öğeler sağa kaydırılır . 1. pozisyona yerleştiriyoruz. Yani 3. pozisyondaki eleman 4. pozisyona, 2. pozisyondaki eleman 3. pozisyona ve 1. pozisyondaki eleman 2. pozisyona kopyalanıyor. Ardından 


ArrayList
boyutu eski dizinin boyutu çarpı 1.5 artı 1 olan bizim durumumuzda, yeni dizinin boyutu 16 olacaktır. Mevcut tüm elemanlar oraya hemen kopyalanacaktır. 




lambo
kaldırıldı. Burada ortadan bir eleman kaldırdık. Açıkçası, listenin sonundan bir öğeyi kaldırmak daha hızlıdır, çünkü öğe diğerlerini kaydırmaya gerek kalmadan basitçe kaldırılır. Dahili dizinin boyutlarından ve bellekte nasıl düzenlendiğinden biraz daha bahsedelim. Bir diziyi genişletmek bazı kaynaklar gerektirir. Buna göre, oluşturmayınArrayList
en az 100 öğeye sahip olacağından eminseniz, varsayılan boyutta. 100. öğeyi eklediğinizde dahili dizinin 6 kez genişletilmesi ve her seferinde tüm öğelerin kaydırılması gerekir .
- 10 elementten 16'ya
- 16 elementten 25'e
- 25'ten 38'e
- 38'den 58'e
- 58'den 88'e
- 88'den 133'e (yani eski dizinin boyutu çarpı 1,5 artı 1)
ArrayList<Car> cars = new ArrayList<>(100);
Şimdi 100 elemanlık bir dizi için bellek bir kerede tahsis edilecek ve bu da diziyi daha verimli hale getirecek (genişletilmesi gerekmeyecek). Bu stratejinin bir de diğer tarafı var. Bir nesneden nesneleri kaldırdığınızda ArrayList
, dahili dizinin boyutu otomatik olarak azalmaz. 88 öğelik tamamen dolu bir dahili diziye sahip olduğumuzu varsayalım ArrayList
: 

ArrayList
Bu durumda, sınıfın özel yöntemlerinden biriyle bellek kullanımımızı optimize edebiliriz :trimToSize()
. Bu yöntem, dahili dizinin uzunluğunu, halihazırda içinde depolanan öğelerin sayısına kadar "kırpır". 
GO TO FULL VERSION