2013-06-16 15 views
7

Başlığında olduğu gibi. Böyle bir şey yapmak için iyi mi:Tamsayı anahtarlı Haritalar'ı Java'da yapmak uygun mu?

HashMap<Integer, Object> foo = new HashMap<>(); 

Ya da belki herhangi bir dizinde değerler ekleyerek izin daha iyi konteyner var? "Daha iyi" derken, "daha iyi performansa sahip olmak" ve "daha az RAM kullanımı" demek istiyorum.

ArrayList<Object> bar = new ArrayList<>(); 
bar.add(10_000, new Object()); 

A yukarıda bu kodda böyle bir şey yapmak istiyorum, ama tabii bu ArrayList ile çalışmaz. Yapmak istediğim liste seyrek; indeksler yayıldı - bu yüzden HashMap ve ArrayList hakkında düşünmekteydim.

Saygılarımızla.

+7

Evet, HashMap'i tanımladığınız gibi kullanmak güzel. Bu örneğin bir "seyrek" dizi oluşturmak için yapılabilir. –

+4

Bunu sorunsuz bir şekilde yapabilirsiniz, ancak tamsayıların _not_'ın sıralanmasına dikkat edin; Bunların sıralanmasını istiyorsanız, bir TreeMap kullanın. Daha iyi performansa sahip bir alternatif arıyorsanız, GNU Trove yardımcı olabilir. – fge

+0

Biliyorum bunu yapabilirim, ama daha iyi bir yol var mı diye soruyorum :) Teşekkürler @fge, GNU Trove'e bakacağım (her ne kadar bende sınıfları tercih ederim :)) – m4tx

cevap

2

Ne (yürürlükte) yapıyoruz seyrek dizi temsil etmek HashMap kullanmaktır.

Bu

makul bir uygulama seçim olabilir ama bu yöntemin etkinliği size ulaşmak için çalışıyoruz ne bağlıdır ve dizinin özelliklerine.

Dizi yeterince seyrek değilse, basit bir dizi yerine HashMap kullanarak belleği kaydedeceksiniz. Ancak, seyrek olmayan bir diziyle karşılaştırıldığında, bir HashMap, bir diziden kabaca bir daha fazla bellek kullanır. Bunun da ötesinde, HashMap numaralı get ve put işlemlerinin kabaca, basit bir dizinin indekslenmesinden daha büyük bir yavaşlama sırası vardır.

Ayrıca dizinin büyüklüğü ve seyrekliği bağlı olarak ölçekli değildir olsun/performanstan pahasına HashMap önemli ölçüde daha az alanı (örneğin, Android seyrek dizi sınıfları) kullanmak temsiller vardır de.

4

Sorularınız çok genel olduğunu ve belirttiğiniz ayrıntılarından o HashMap ve ArrayList hem gereksinimi yerine görünüyor ve sadece performansı hakkında rahatsız. Performans çeşitli yönleri vardır:

  1. veri bitişik veya daha az yayılmış ise [yani tamsayılar az ya da çok sırayla şunlardır] HashMap kıyasla yerleştirme maliyeti daha az olduğu gibi sonra ben ArrayList'deki gider.
  2. Verileriniz çok fazla yayılıma sahipse veya ekleme ile birlikte çok fazla silme gerçekleştirecekseniz, HashMap için giderdim.

Yani sizin ihtiyacına bağlıdır.

DÜZENLEME: Veri yayılma çok vardır sonra HashMap gitmek yoludur. Array veya ArrayList kullanırsanız, verilerin depolanması arasındaki boşluklardan dolayı bellek tüketiminiz artacaktır. HashMap ekleme maliyeti, Array'dan daha yüksektir, ancak RAM hakkında emin olduğunuzdan, HashMap ile gitmelisiniz.

+0

Verilerim çok fazla yayıldı :) Bu bilgiyi soruna ekledim. – m4tx

+0

Düzenle'mi gör. HashMap ile giderdim. – Lokesh