2010-12-09 58 views
6

我想創建一個映射,其中String作爲鍵和基元作爲值。我正在看Java文檔,並沒有看到Primitive是一個類的類型,或者他們共享某種包裝類。Java映射和基元

如何限制該值爲原始值?

Map<String, Primitive> map = new HashMap<String, Primitive>();

+0

這是我的錯,因爲不清楚。我說我想約束的價值是一個原始類型我的意思是我希望允許任何基本類型被用作特定映射中的值。 – Prospero 2010-12-09 15:23:40

回答

7

Java Autoboxing允許在Long, Integer, Double上創建地圖,然後使用原始值對其進行操作。例如:

java.util.HashMap<String, Integer> map = new java.util.HashMap<String, Integer>(); 
map.put("one", 1); // 1 is an integer, not an instance of Integer 

如果你想在一個地圖不同的原始類型來存儲,您可以通過進行Map<String, Number>它。允許存儲的值BigDecimalBigIntegerByteDoubleFloatIntegerLongShort(和AtomicLongAtomicInteger)。

下面是一個例子:

Map<String, Number> map = new HashMap<String, Number>(); 

map.put("one", 1); 
map.put("two", 2.0); 
map.put("three", 1L); 

for(String k:map.keySet()) { 
    Number v = map.get(k); 
    System.err.println(v + " is instance of " + v.getClass().getName() + ": " + v); 
} 
2

你可以做到以下幾點:

Map<String, Integer> map = new HashMap<String, Integer>() 

然後操作,如:

map.put("One", 1); 

會工作。原始1將自動裝箱到Integer。同樣:

int i = map.get("One"); 

也將工作,因爲Integer會得到自動拆箱到int

查看autoboxing and autounboxing的一些文檔。

+1

`Map`是一個界面。 – khachik 2010-12-09 15:10:40

+0

地圖是aninterface .. – 2010-12-09 15:11:18

+0

@khacik,固定。感謝您指出了這一點。 – jjnguy 2010-12-09 15:11:20

2

每個基元都有一個包裝類,如java.lang.Longlong

所以,你可以在包裝類映射到String,如果您使用Java 1.5+,乾脆把元到地圖:

Map<String, Integer> map = new HashMap<String, Integer>(); 
map.put("key", 10); 
int value = map.get("key"); // value is 10. 
1

你會用自己的盒裝對應。

Map<String,Integer> map = new HashMap<String,Integer>(); 

整數是基元int的不可變盒形類型。有類似的Short,Long,Double,Float和Byte boxed類型。

0

Map接口中不能有原語作爲鍵或值。相反,您可以使用Wrapper類,如Integer,Character,Boolean等。

瞭解更多關於wiki

4

谷歌爲「Java的古地圖」,你會發現一些特殊類型的避免自動裝箱的需要。這樣的一個例子是:https://labs.carrotsearch.com/hppc.html

但是,一般來說,你應該在自動裝箱中做得很好,就像其他答案中提到的一樣。

1

如果由於性能原因您需要該值爲原始值,則可以使用TObjectIntHashMap或類似的值。

例如與地圖<字符串,整數>

TObjectIntHashMap<String> map = new TObjectIntHashMap(); 

map.put("key", 10); 
int value = map.get("key"); 

一個區別是,該值是int類型原語,而不是整數對象的。