2010-03-24 18 views
24

編譯器會抱怨這樣的代碼:爲什麼Java編譯器不像HashMap中的值類型那樣使用基本int類型?

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

它寫道:「意外型」和點上int。如果我用Stringi+1替換int,i+"1",編譯就OK。這裏有什麼問題?

+0

我i +「1」結束爲「01」爲i == 0; 「11」爲i == 1等? – extraneon 2010-03-24 15:28:13

+0

是的。對於i == 0,i +「1」最終爲「01」,依此類推。 – Roman 2010-03-24 15:33:31

+0

googling「java hashmap int」指向已經提出/解決此問題的許多引用。先研究你的問題。 – user2573153 2014-04-24 22:42:45

回答

41

這是罰款Integer,但並不是很好int - Java generics only work with reference types,基本上:(

試試這個 - 雖然知道這將框中的一切內容:使用

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

如果你有小集合,然後引用類型可能沒有問題,但是還有其他選擇,好的是trove4j。Trove在使用純原語重新創建集合API方面做得相當不錯,回報爲,其中的內存使用率更低,很多情況下,插入/查找時性能更好。你的榜樣應該是這樣的:

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

唯一的缺點,在我的經驗,是缺乏這些併發實現的,所以你必須找出另一種方式來管理線程安全。

相關問題