Her ne kadar ArrayList'i kullanmayı öneren cevaplar çoğu senaryoda mantıklı olsa da, göreceli performansla ilgili asıl soru gerçekten cevaplanmamıştır.
Bir dizi ile yapabileceğiniz birkaç şey vardır:
- oluştur
- bir eşya belirle
- bir eşya al
- kopyala / kopyala
Genel sonuç
Alma ve ayarlama işlemleri bir ArrayList'te biraz daha yavaş olsa da (makinemdeki arama başına sırasıyla 1 ve 3 nanosaniye), yoğun olmayan herhangi bir kullanım için ArrayList'e karşılık bir dizi kullanmanın çok az yükü vardır. Ancak akılda tutulması gereken birkaç şey vardır:
- listedeki (arama yaparken
list.add(...)
) yeniden boyutlandırma işlemleri maliyetlidir ve kişi ilk kapasiteyi mümkün olduğunca yeterli bir seviyeye ayarlamaya çalışmalıdır (bir dizi kullanılırken aynı sorunun ortaya çıktığını unutmayın)
- ilkellerle uğraşırken, diziler çok sayıda boks / kutulama dönüşümünden kaçınmaya izin vereceklerinden önemli ölçüde daha hızlı olabilir
- ArrayList'te (çok yaygın değil!) değerleri alan / ayarlayan bir uygulama, bir diziye geçerek% 25'ten fazla bir performans artışı görebilir
Ayrıntılı sonuçlar
Standart bir x86 masaüstü makinesinde JDK 7 ile jmh karşılaştırma kütüphanesini (nanosaniye cinsinden zamanlar) kullanarak bu üç işlem için ölçtüğüm sonuçlar . Sonuçların karşılaştırılabilir olduğundan emin olmak için testlerde ArrayList öğesinin hiçbir zaman yeniden boyutlandırılmadığını unutmayın. Karşılaştırma kodu burada bulunabilir .
Array / ArrayList Oluşturma
Aşağıdaki ifadeleri uygulayarak 4 test yaptım:
- createArray1:
Integer[] array = new Integer[1];
- createList1:
List<Integer> list = new ArrayList<> (1);
- createArray10000:
Integer[] array = new Integer[10000];
- createList10000:
List<Integer> list = new ArrayList<> (10000);
Sonuçlar (arama başına nanosaniye cinsinden,% 95 güven):
a.p.g.a.ArrayVsList.CreateArray1 [10.933, 11.097]
a.p.g.a.ArrayVsList.CreateList1 [10.799, 11.046]
a.p.g.a.ArrayVsList.CreateArray10000 [394.899, 404.034]
a.p.g.a.ArrayVsList.CreateList10000 [396.706, 401.266]
Sonuç: gözle görülür bir fark yok .
operasyon almak
Aşağıdaki ifadeleri uygulayarak 2 test yaptım:
- GetList:
return list.get(0);
- GetArray:
return array[0];
Sonuçlar (arama başına nanosaniye cinsinden,% 95 güven):
a.p.g.a.ArrayVsList.getArray [2.958, 2.984]
a.p.g.a.ArrayVsList.getList [3.841, 3.874]
Sonuç: bir diziden almak, bir ArrayList'ten almaktan yaklaşık% 25 daha hızlıdır , ancak fark sadece bir nanosaniye civarındadır.
operasyonları ayarla
Aşağıdaki ifadeleri uygulayarak 2 test yaptım:
- set listesi:
list.set(0, value);
- setArray:
array[0] = value;
Sonuçlar (arama başına nanosaniye cinsinden):
a.p.g.a.ArrayVsList.setArray [4.201, 4.236]
a.p.g.a.ArrayVsList.setList [6.783, 6.877]
Sonuç: diziler üzerinde ayarlanan işlemler listelerden yaklaşık% 40 daha hızlıdır , ancak elde edileceği gibi, her ayar işlemi birkaç nanosaniye sürer - bu nedenle farkın 1 saniyeye ulaşması için liste / dizi yüzlerce öğenin ayarlanması gerekir milyonlarca kez!
klon / kopyala
İçin ArrayList'ın kopya yapıcı delegeler Arrays.copyOf
performans dizisi kopyalama ile aynıdır, böylece (vasıtasıyla bir dizi kopyalama clone
, Arrays.copyOf
ya da System.arrayCopy
herhangi bir malzeme farkı epeyce yapar ).