首页 > 解决方案 > 这两种创建 TreeMap(或任何地图)的方式有什么区别?

问题描述

我正在阅读项目中的一些代码,并遇到了这行代码:

private Map<String, Map<String, List<String>>> wordbatch;

在代码中,我在构造函数中到达了另一行代码:

wordbatch = new TreeMap<String, Map<String, List<String>>>;

单行代码会产生同样的效果吗?:

Map<String, Map<String, List<String>>> wordbatch = new TreeMap<String, Map<String, List<String>>>();

这行代码和上面两行代码有什么区别?

任何帮助表示赞赏,非常感谢您。试图增强我对地图的了解。

标签: javamapping

解决方案


您提出的陈述之间存在一些细微差别。

在第一种情况下,您在 X 行声明了一个实例变量(其值为null),并且在 Y 行的代码中的某处,您给它另一个值,一个新映射。

在第二种情况下,您既要声明它又要给它一个值。但是,重要的是发生在哪里。

  • 如果您将完整的声明放在原始声明所在的位置,在第 X 行,那么它仍然是一个实例变量。然而,
    1. 你忘了你的private. 如果您不希望同一包中的其他类直接使用该变量,这可能很重要。
    2. 如果代码的任何部分依赖于这个变量在开始时可能为 null 的事实(查找检查此变量是否为 null 的代码),那么您可能会通过在声明中对其进行初始化来引入错误。
  • 如果您将该声明放在原始赋值的位置,在 Y 行,那么您将不再声明实例变量。这成为一个局部变量。期望此实例变量存在的其余代码将产生编译错误。实例变量必须在任何方法或构造函数之外声明。

请注意,如果 Y 行在您的构造函数中,并且它是唯一的构造函数,那么这两种初始化方式几乎没有区别。


推荐阅读