1. Nasıl ArrayListyapılandırılır ?

ArrayListöğeleri depolamak için en yaygın olarak kullanılan Java sınıfıdır. Peki nasıl ArrayListçalışıyor ve neden herkes bundan bu kadar hoşlanıyor?

Yapısı ArrayListbasit ve ustaca. Her ArrayListnesne iki alan içerir:

  • Bir dizi öğe
  • sizeListedeki eleman sayısını saklayan bir değişken

Dahili olarak, bir ArrayListnesne çok sıradan bir dizi içerir! Ama hepsi bu kadar değil. Listenin uzunluğunu saklayan bir boyut değişkeni de vardır . Bu nasıl çalışır:

Başlangıçta, liste içindeki dizinin uzunluğu 10'dur ve değişken size0'dır.

Listeye bir eleman eklerseniz, dizinin 0. hücresinde saklanır ve size1'e yükselir.

Bir eleman daha eklerseniz, 1. hücrede depolanacak ve sizetekrar 1 artarak ikiye eşit olacaktır.

Dizide boşluk kalmadığında başka bir öğe eklerseniz, yöntemde aşağıdakiler gerçekleşir add():

  1. Bir öncekinin bir buçuk katı uzunluğunda yeni bir dizi oluşturulur.
  2. Eski dizinin tüm öğeleri yeni diziye kopyalanır.
  3. Nesnede ArrayList, yeni diziye yapılan bir başvuru, eski diziye yapılan başvurunun yerini alır .
  4. Geçirilen öğe , yeni dizinin 10. hücresine kaydedilir .
  5. Boyut değişkeni 1 artar ve şimdi 11'e eşit olur

Listenin ortasına bir öğe eklerken (eklerken) benzer bir şey olur. Mevcut elemanlar 1 sağa kaydırılır ve geçirilen eleman dizinin yeni serbest bırakılan hücresine yazılır.

Şimdi listeleri içeren en temel senaryoları ele alacağız:


2. Bir öğeye bir öğe eklemeArrayList

Öğeler eklendiğinde listenin içinde neler olduğuna bir göz atalım. Bir ArrayList nesnesi oluşturulduktan hemen sonra, bellekte şöyle bir şeye sahibiz:

ArrayList'e eleman ekleme

ArrayListİki alan (iki değişken) içeren bir nesnemiz var : bir kapsayıcı ( datadizi) ve saklanan öğelerin sayısı ( size). Değişken data, 10 öğeyi saklayabilen bir kapsayıcıya (diziye) bir başvuru depolar.

5 sayısını diziye eklemeye karar verirsek aşağıdaki resmi elde ederiz:

ArrayList 2'ye eleman ekleme

Dizi artık 5 öğesini depolar ve size == 1.

Birisi şimdi size()nesnemizdeki yöntemi çağırırsa ArrayList, dönüş değeri listede depolanan öğe sayısı olacaktır: 1. Listedeki öğe sayısı, dizinin depolama kapasitesi ile aynı değildir.

Ne mevcut depolama kapasitesi ne de dizinin kendisi nesnenin dışında hiçbir zaman erişilebilir (görünür) olmayacaktır ArrayList. Bu, 'ın dahili verileridir ve her zaman öyle olacaktır ArrayList.

Listeye 7 sayı daha ekleyelim: 10, 20, 30, 40, 50, 60, 70.

Şimdi bellek şöyle görünecek:

ArrayList'e eleman ekleme

Yöntemi şimdi çağırırsanız size(), listedeki yeni öğe sayısı olan 8 sayısını döndürür. Bu değerin dahili dizinin boyutuyla hiçbir ilgisi yoktur.

Önemli:

Bu resimde bir aşırı basitleştirme var.

Sınıf ArrayList, ilkel türleri depolayamaz, bu Integernedenle int. Kap, {5, 10, 20, 30, 40, 50, 60, 70} değerlerini doğrudan depolamaz, bunun yerine nesnelere yapılan başvuruları depolar Integer. Konteyner deposundaki tüm boş hücreler null.



3. Bir listenin uzunluğunu artırma

İç dizisinde boş hücre kalmadığında bir listenin içinde neler olduğuna bir göz atalım.

10 öğeden oluşan bir listemiz olduğunu varsayalım:

Bir listenin uzunluğunu artırma

100 sayısını eklemeye karar veriyoruz . Yöntemde olan budur add():

Adım 1 — Yeni bir dizi oluşturun:

Bir listenin uzunluğunu artırma 2

Adım 2 — Eski dizideki tüm öğeleri yeni diziye kopyalayın:

Bir listenin uzunluğunu artırma 2

Adım 3 — Eski diziyi değiştirin (referansı nesnenin ArrayListdahili dizisine değiştirin):

Bir listenin uzunluğunu artırma 3

Adım 4 — Başarmak için çok çalıştığımız yeni numarayı ekleyin:

Bir listenin uzunluğunu artırma 4