我为我的程序使用了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();
答案 0 :(得分:7)
任何涉及HashMap
或Map
且没有类型参数(尖括号&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>();
答案 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
。