当前位置: 首页 > 知识库问答 >
问题:

这些初始化HashMap的方法有什么不同?

申嘉慕
2023-03-14

我在我的程序中使用了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个答案

滕学义
2023-03-14
HashMap<Character, Integer> alphabet1 = new HashMap(); // (1)

(1) 在不使用泛型的情况下初始化哈希映射,但在之后使用泛型对哈希映射进行不安全转换。这应该会引发编译器警告。

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

(2)用泛型初始化HashMap,并用泛型声明类型为HashMap的变量

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

在这里,编译器使用类型推断从左侧的声明推断HashMap的属性。

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

(3)使用泛型初始化HashMap,但是变量alphabet1不重用泛型信息。因此,您不能以泛型方式访问此HashMap值上的方法(例如,当调用alphabet1.get('a')时,您将获得一个转换为java.lang.Object的值,而不是转换为整数)。

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

劳和雅
2023-03-14

你错过了正确的选择:

Map<Character, Integer> alphabet1 = new HashMap<Character, Integer>();
  1. 泛型声明允许编译器在编译时检查“alphabet1”的用法
姜飞飙
2023-03-14

任何涉及HashMapMap但没有类型参数的内容(尖括号

“正确”的方式是

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

第一种方法使用接口映射作为引用类型。一般来说,它更地道,风格也更好。

还有一种你没有提到的方法,使用Java7菱形操作符

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

这大致相当于前两种正确的方法。左侧引用类型的参数隐式地提供给右侧的构造函数。

 类似资料:
  • 问题内容: 我为程序使用了HashMap,它运行良好,但是我不理解HashMap的这些初始化之间的区别。 假设我正在实现一个HashMap,以字符作为键,并以整数作为值。这些有什么区别? 问题答案: 任何涉及或不涉及类型实参的内容(尖括号<和>及其之间的部分)都是原始类型,不应使用。原始类型不是通用类型,可以让您做不安全的事情。 “正确”的方法是 第一种使用接口Map作为参考类型。它通常比较惯用,

  • 问题内容: TensorFlow中初始化变量的标准方法是 经过一段时间的学习后,我创建了一组新变量,但是一旦初始化它们,它将重置所有现有变量。目前,解决此问题的方法是保存所需的所有变量,然后在tf.initalize_all_variables调用之后重新应用它们。这有效,但是有点笨拙。我在文档中找不到像这样的东西… 有谁知道初始化未初始化变量的好方法吗? 问题答案: 没有优雅的方法可以枚举图中的

  • 为什么x没有在下面初始化? 平均而言,对于一半的迭代,for循环中的将是,从而初始化。对于另一半,找到的 循环替换为 同样糟糕。只有

  • 问题内容: 我不熟悉Java,而是通过创建一个简单的NaiveBayes分类器进行练习的。我还是对象实例化的新手,想知道如何初始化HashMaps的HashMap。在将新观察值插入分类器时,我可以为给定类中的看不见的功能名称创建新的HashMap,但是我需要初始化吗? 请注意,这个问题并非专门针对朴素贝叶斯分类器,只是认为我会提供一些上下文。 问题答案: 是的,您需要对其进行初始化。 当您想向cl

  • 问题内容: 所以我对Java中的s 有两个问题: 初始化a的正确方法是什么?我认为在我的情况下最好使用: 但是Eclipse一直建议我使用: 哪个更好? 可以将不同类型的对象/数据类型保存为值吗?例如,是否可以正常工作: 在第一个中,我想要一个a作为值​​,在第二个中,我想要一个字符串。用s 在Java中可以吗?另外,可以将a 作为值存储在?中吗? 问题答案: 这实际上取决于您需要哪种类型的安全性