【问题标题】:HashMap initialization [duplicate]HashMap初始化[重复]
【发布时间】:2014-07-17 18:36:12
【问题描述】:

如果我写

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

相对于

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

或相反

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

第一个会不会不安全?

【问题讨论】:

  • 后两者是等价的;不太确定第一个,但我相信由于缺乏泛型,它会让事情变得有点混乱。
  • 我不知道“不安全”,但对于第二个变体,您可能想阅读What is the point of the diamond operator in Java 7?
  • @Jeroen Vannevel 是的,我的问题是第一个有什么不好
  • 您应该会看到为所有三个生成的相同字节码。

标签: java


【解决方案1】:

第二个只是第三种选择的缩写。

如果您使用不同的构造函数,第一种方法可能会导致问题,因为它忽略了泛型。

例如,以下编译:

Map<Integer, Integer> intMap = ...;
Map<String, String> strMap = new HashMap(intMap);

它甚至会在没有错误的情况下执行,因为在运行时没有通用检查。但是如果intMap 包含数据并且您从strMap 访问它(例如,通过遍历键),您将得到运行时异常。

这样的错误很难跟踪,因为异常可能发生在远离违规行的地方。

因此,在您的特定情况下,它不会引起问题,但如果您养成这种习惯,最终您会遇到问题。此外,您将收到必须禁止或忽略的编译器警告,这两种情况都应该避免。

【讨论】:

    【解决方案2】:

    亚历克斯,

    这不太可能是“不安全的”,但第三个示例的额外特殊性为运行时提供了最大程度的类型安全保护。

    我建议使用带有泛型的接口来实例化:

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

    【讨论】:

    • 为什么这比new HashMap&lt;&gt;()好?它提供什么保护?
    • 有点误导;第二个和第三个选项完全相等。您所说的“额外的特异性”实际上是额外的冗长
    猜你喜欢
    • 2022-12-06
    • 2020-06-30
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    相关资源
    最近更新 更多