java:HashMap <String,int>不起作用


128

HashMap<String, int>似乎不起作用,但HashMap<String, Integer>确实起作用。有什么想法吗?


您为问题选择的单词令人困惑,您能否澄清?究竟是什么不起作用,您可以发布代码吗?
Anthony Forloney,2009年

Answers:


203

您不能在Java中将基本类型用作通用参数。改用:

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

使用自动装箱/拆箱,代码几乎没有区别。自动装箱意味着您可以编写:

myMap.put("foo", 3);

代替:

myMap.put("foo", new Integer(3));

自动装箱意味着将第一个版本隐式转换为第二个版本。自动拆箱意味着您可以编写:

int i = myMap.get("foo");

代替:

int i = myMap.get("foo").intValue();

intValue()如果未找到键,则隐式调用意味着将生成一个NullPointerException,例如:

int i = myMap.get("bar"); // NullPointerException

原因是类型擦除。不同于,例如,在C#中,泛型类型不会在运行时保留。它们只是显式转换的“语法糖”,可以节省您这样做的时间:

Integer i = (Integer)myMap.get("foo");

举个例子,这段代码是完全合法的:

Map<String, Integer> myMap = new HashMap<String, Integer>();
Map<Integer, String> map2 = (Map<Integer, String>)myMap;
map2.put(3, "foo");

3
您的最后一个示例不起作用:无法从Map <String,Integer>转换为Map <Integer,String>
T3rm1 2013年

考虑到换行中的每个单独的代码,在使用intValue()方法之前,必须先将第5行的代码强制转换为Integer,因为在使用get()方法时,它将被视为对象。
应届生,2016年


2

您不能在中使用基本类型HashMapint,或者double不起作用。您必须使用其封闭类型。举个例子

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

现在两者都是对象,因此可以使用。


0

int是原始类型,您可以在此处阅读java中原始类型的含义,而Map是必须以对象作为输入的接口:

public interface Map<K extends Object, V extends Object>

object表示一个类,也意味着您可以创建从其扩展的另一个类,但不能创建从int扩展的类。因此,您不能将int变量用作对象。我有两个解决方案可以解决您的问题:

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

要么

Map<String, int[]> map = new HashMap<>();
int x = 1;

//put x in map
int[] x_ = new int[]{x};
map.put("x", x_);

//get the value of x
int y = map.get("x")[0];

-3

您可以在通用参数中使用引用类型,而不是原始类型。所以在这里你应该使用

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

并将值存储为

myMap.put("abc", 5);

1
这不能回答问题
smac89'5
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.