2010-03-24 14 views
24

derleyici bu kodu şikayet:Neden Java derleyicisi HashMap'teki değerler için ilkel int türünü değil?

HashMap<String,int> userName2ind = new HashMap<String,int>(); 
    for (int i=0; i<=players.length; i++) { 
     userName2ind.put(orderedUserNames[i],i+1); 
    } 

O int üzerinde "beklenmedik tip" ve noktayı yazar. int'u String ve i+1 tarafından i+"1" değiştirirseniz, derleme işlemi tamamlanır. Burada neyin var?

+0

i + "1" i == 0 için "01" olmuyor mu; I == 1 vs için "11"? – extraneon

+0

Evet. i + "1" i == 0 için "01" olmak üzere biter ve böyle devam eder. – Roman

+0

googling "java hashmap int" zaten bu soruyu sormuş/çözmüş birçok referansa işaret etmektedir. İlk önce sorunuzu araştırın. – user2573153

cevap

41

O Integer ile ince fakat int ile tamam değil - temelde, Java generics only work with reference types :(

bu deneyin - farkında olmasına rağmen her şeyi kutu olacak: kullanarak sonra

HashMap<String,Integer> userName2ind = new HashMap<String,Integer>(); 
for (int i=0; i<=players.length; i++) { 
    userName2ind.put(orderedUserNames[i],i+1); 
} 
2

küçük koleksiyonları varsa, Referans türleri muhtemelen iyi, ama alternatifler ve iyi bir tane var trove4j.Veve, saf ilkelleri kullanarak koleksiyon API'sini yeniden oluşturmak için oldukça iyi bir iş çıkardı.Ödeme çok düşük bellek kullanımı ve birçok durumda, takarken/ararken daha iyi performans.

TObjectIntHashMap<String> userName2ind = new TObjectIntHashMap<String>(); 
for (int i=0; i<=players.length; i++) { 
    userName2ind.put(orderedUserNames[i],i+1); 
} 

tek dezavantajı, benim deneyim, bunların eşzamanlı uygulamaların olmaması, yani iplik güvenliğini yönetmek için başka bir yol bulmalıyız: Sizin örnek şu şekilde görünecektir.