这些初始化HashMap的方法之间的区别是什么?

时间:2014-10-25 18:12:19

标签: java generics hashmap

我为我的程序使用了HashMap,它工作正常,但我不理解这些HashMap初始化之间的区别。

让我们说我实现了一个HashMap,其中一个字符作为键,一个整数作为值。它们之间的区别是什么?

HashMap<Character, Integer> alphabet1 = new HashMap();
HashMap<Character, Integer> alphabet1 = new HashMap<Character, Integer>();
HashMap alphabet1 = new HashMap<Character, Integer>();
Map alphabet1 = new HashMap<Character, Integer>();
HashMap alphabet1 = new HashMap<Character, Integer>();
HashMap alphabet1 = new HashMap();
Map alphabet1 = new HashMap();

3 个答案:

答案 0 :(得分:7)

任何涉及HashMapMap且没有类型参数(尖括号&lt;和&gt;以及它们之间的部分)的内容都是raw type and shouldn't be used。原始类型不是通用的,可以让你做不安全的事情。

&#34;正确&#34;方式是

Map<Character, Integer> alphabet1 = new HashMap<Character, Integer>();
HashMap<Character, Integer> alphabet1 = new HashMap<Character, Integer>();

第一个使用接口Map作为引用类型。 It is generally more idiomatic and a good style

另一种你没有提到的方式,using the Java 7 diamond operator

Map<Character, Integer> alphabet1 = new HashMap<>();
HashMap<Character, Integer> alphabet1 = new HashMap<>();

这或多或少等同于前两种正确方法。左侧的引用类型的参数隐式提供给右侧的构造函数。

答案 1 :(得分:3)

你错过了正确的选择:

Map<Character, Integer> alphabet1 = new HashMap<Character, Integer>();
  1. 泛型声明允许编译器检查您的字母1&#39;在编译期间使用。
  2. 左侧的Map / HashMap声明了您的&#39; alphabet1&#39;应该考虑变量:作为Map(接口)或HashMap(具体类的实例)。当然首选接口 - 它使您的代码更加健壮以进行进一步的更改。

答案 2 :(得分:1)

HashMap<Character, Integer> alphabet1 = new HashMap(); // (1)

(1)在不使用泛型的情况下初始化HashMap,但之后使用带有泛型的HashMap使用不安全的强制转换。这应该引发编译器警告。

HashMap<Character, Integer> alphabet1 = new HashMap<Character, Integer>(); // (2)

(2)使用泛型初始化HashMap并使用泛型声明类型为HashMap的变量。它可以简称为

HashMap<Character, Integer> alphabet1 = new HashMap<>(); // (2b)

这里,编译器使用类型推断来从左侧的声明中推断HashMap的genrics。

HashMap alphabet1 = new HashMap<Character, Integer>(); // (3)

(3)使用泛型初始化HashMap,但变量alphabet1不重用泛型信息。因此,您无法以通用方式访问此HashMap值的方法(例如,在调用java.lang.Object时,您将获得alphabet1.get('a')的值,而不是强制转换为{Integer 1}})。

Map alphabet1 = new HashMap<Character, Integer>(); // (4)

(4)与(3)类似,但在此处,alphabet1使用Map而不是HashMap键入。因此,您无法访问HashMap中定义的方法,但不能访问其超级接口Map中的方法。

HashMap alphabet1 = new HashMap(); // (5)

(5)类似于(3),它不使用泛型来初始化HashMap

Map alphabet1 = new HashMap(); // (6)

(6)类似于(4)并且不使用泛型来初始化HashMap