Bir HashMap aslında O (1) performansa sahipken, bir anahtar durumu, derleyicinin bir tablo düğmesi veya arama anahtarı kullanmasına bağlı olarak O (1) veya O (log (n)) olabilir. Bir switch deyimi açıkça HashMap vs Anahtar ifadesi performansı
switch (int) {
case 1:
case 2:
case 3:
case 4:
default:
}
o zaman bir tableswitch kullanmak istiyorsunuz gibi yazılı ve eğer
Anlaşılır, standart bir HashMap üzerinde performans avantajı var. Ama ya anahtar ifadesi seyrek ise? Bu, şu iki karşılaştırmayla karşılaşacağım iki örnek olacaktır:
HashMap<Integer, String> example = new HashMap<Integer, String>() {{
put(1, "a");
put(10, "b");
put(100, "c");
put(1000, "d");
}};
.
switch (int) {
case 1:
return "a";
case 10:
return "b";
case 100:
return "c";
case 1000:
return "d";
default:
return null;
}
Daha fazla iş hacmi, bir arama anahtarı veya HashMap ne sağlar? HashMap'in üst kısmı, arama anahtarını erkenden bir avantaj sağlıyor mu, ancak vaka/girdi sayısı arttıkça neticede küçülüyor mu?
Edit: JMH kullanarak bazı karşılaştırmaları denedim, burada benim sonuçlarım ve kullanılan kod vardır. https://gist.github.com/mooman219/bebbdc047889c7cfe612 Siz bahsettiğiniz gibi, arama anahtarı açıklaması HashTable'dan daha iyi performans gösterdi. Hala neden hala merak ediyorum.
Her performans sorusunda olduğu gibi: bunu ölçmelisiniz. http://stackoverflow.com/q/504103/139010 Sonuçlarınızı dört gözle bekliyorum ':)' –
Farkı ölçmek için iyi bir varsayılan cevap vermek ... Anahtar deyiminin daha hızlı olmasını beklerim çünkü Daha az talimat gerektirecektir. C ve GCC ile, bir anahtar/elseif-zincirleri, atlama tabloları veya içeriğe bağlı olmayan bir şekilde uygulanır (örneğin, anahtarda kaç durum, dizin oluşturma vb.) –
Daha az karmaşıklığa ek olarak, arama anahtarı mekanizması referans lokalitesinin önemli avantajı. Hashmap 1 olmalıdır. 2. kova dizisini ayırt etme; 3. Dizideki dizideki Node örneğinin 1'den türetilmiş dereferansı; 4. İstenen anahtara eşit olduğundan emin olmak için Düğümün Tamsayı anahtarının dereference; 5. Son olarak düğümden dönüş değerini dereference. –