CodeGym/Java Blogu/Rastgele/Resimlerdeki ArrayList
John Squirrels
Seviye
San Francisco

Resimlerdeki ArrayList

grupta yayınlandı
MERHABA! Bugünün konusu, ArrayListönceki derslerden hem daha kolay hem de daha zor olacak.
Resimlerle ArrayList - 1
ArrayListDaha 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, ArrayListiç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<>();
}
Resimlerle ArrayList - 2 İ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 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);
Resimlerle ArrayList - 3 Bu yeterince açık. Ortaya, yani diğer elemanların arasına eklersek ne olur?
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 Resimlerle ArrayList - 4 yeni elemanımız yerine yerleştiriliyor. Önceki öğe (bugatti) zaten oradan yeni bir konuma kopyalanmıştır. Resimlerle ArrayList - 5 Şimdi diziye yeni elemanlar eklenecek yerler yoksa bu işlemin nasıl gerçekleştiğine bakalım. Resimlerle ArrayList - 6 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.ArrayListboyutu 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. Resimlerle ArrayList - 7 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. Resimlerle ArrayList - 8 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. Resimlerle ArrayList - 9 Görünüşü şöyle: Resimlerle ArrayList - 10 Ve sonunda istediğimizi elde ediyoruz: Resimlerle ArrayList - 11 Öğe lambokaldı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ınArrayListen 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)
Tahmin edebileceğiniz gibi, bu oldukça kaynak yoğun. Bu nedenle, gerekli öğe sayısını (hatta yaklaşık olarak) zaten biliyorsanız, belirli bir boyutta bir dizi içeren bir liste oluşturmak daha iyidir:
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: Resimlerle ArrayList - 12 Program çalışırken 77 öğeyi kaldırdık, yani geriye yalnızca 11 öğe kaldı: Resimlerle ArrayList - 13 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! ArrayListBu 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". Resimlerle ArrayList - 14 Şimdi sadece ihtiyacımız kadar bellek ayırdık! :)
Yorumlar
  • Popüler
  • Yeni
  • Eskimiş
Yorum bırakmak için giriş yapmalısınız
Bu sayfada henüz yorum yok