问题
I want to create a mapping that takes a String
as the key and a primitive as the value. I was looking at the Java docs and did not see that Primitive was a class type, or that they shared some kind of wrapping class.
How can I constrain the value to be a primitive?
Map<String, Primitive> map = new HashMap<String, Primitive>();
回答1:
Java Autoboxing allows to create maps on Long, Integer, Double
and then operate them using primitive values. For example:
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
If you want to store in one map different primitive types, you can to it by making a Map<String, Number>
. Allows to store values of BigDecimal
, BigInteger
, Byte
, Double
, Float
, Integer
, Long
, Short
(and AtomicLong
, AtomicInteger
).
Here is an example:
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:
Google for "Java Primitive Maps" and you will find some specialised types which avoid the need for autoboxing. An example of this is: https://labs.carrotsearch.com/hppc.html
However, in general you should do fine with autoboxing as mentioned in other answers.
回答3:
You can do the following:
Map<String, Integer> map = new HashMap<String, Integer>()
Then operations like:
map.put("One", 1);
will work. The primitive 1
will get auto-boxed into an Integer
. Likewise:
int i = map.get("One");
will also work because the Integer
will get auto-unboxed into an int
.
Check out some documentation on autoboxing and autounboxing.
回答4:
Every primitive has a wrapper class, like java.lang.Long for long
.
So you can map the the wrapper class to String
and, if you use Java 1.5+, simply put primitives to the map:
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("key", 10);
int value = map.get("key"); // value is 10.
回答5:
You would use their boxed counterpart.
Map<String,Integer> map = new HashMap<String,Integer>();
Integer is an immutable boxed type of the primitive int. There are similar Short, Long, Double, Float and Byte boxed types.
回答6:
If you need the value to be a primitive for performance reasons, you can use TObjectIntHashMap or similar.
e.g.
TObjectIntHashMap<String> map = new TObjectIntHashMap();
map.put("key", 10);
int value = map.get("key");
One difference with Map<String, Integer> is that the values are of type int primitive rather than Integer object.
回答7:
You can't have a primitive as key or value in Map
interface. Instead you can use Wrapper classes, like Integer
, Character
, Boolean
and so on.
Read more on wiki.
来源:https://stackoverflow.com/questions/4399645/java-mappings-and-primitives