2010-12-09 61 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类型原语,而不是整数对象的。