Java Mappings and Primitives

随声附和 提交于 2019-12-10 04:10:07

问题


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 Stringand, 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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!