【问题标题】:Why does declaring similar object name with HashMap has no conflict?为什么用HashMap声明相似的对象名没有冲突?
【发布时间】:2015-10-21 12:11:53
【问题描述】:

我有一个问题。为什么下面的代码因为变量冲突而不能用eclipse运行?

PdfPTable testObj1 = new PdfPTable(6);
PdfPTable testObj1 = new PdfPTable(6);

但是如果我使用带有循环的 HashMap 它将起作用:

Map<String, PdfPTable> hash = new HashMap<>();

    for (i = 1; i <= 1; i++){
        hash.put("testObj" + String.valueOf(i), new PdfPTable(6));
        hash.put("testObj" + String.valueOf(i), new PdfPTable(6));
    }

有人可以向我解释为什么可以运行底部示例吗?提前致谢。

【问题讨论】:

  • testObj1 不能与testObj1 同名
  • 因为您在第一种情况下声明 testObj1 2 次,而不是在第二种情况下
  • 仅供参考,地图中的第二部分是值部分,可以重复

标签: java oop object hashmap


【解决方案1】:

在第一种情况下,您在编译时创建具有特定变量名称的变量。因此,如果您在同一范围内有 2 个具有相同名称的变量,您的编译器会抛出错误。

在第二种情况下,您实际上是使用字符串作为 HashMap 的键。在 HashMap 中使用相同的键会导致覆盖为该键存储的旧值。即便如此,这与这里的变量名无关。

除了你的第二个例子,你也可以写

Map<String, PdfPTable> hash = new HashMap<>();
hash.put("testObj1", new PdfPTable(6));
hash.put("testObj1", new PdfPTable(6));

这应该表明您实际上正在用新的第二个实例覆盖 PdfPTable 的第一个实例。

【讨论】:

  • Using the same key in a HashMap leads to overwriting the old value stored for this key. 我不知道这个。感谢您的水晶解释和示例。
  • @sg552 您总是应该查看Java API 以确定库类及其方法的行为。它们非常好,并且通常还提供了注意事项的示例
【解决方案2】:

这两个例子不相关。在第一个中,您尝试在同一范围内声明两个具有相同名称的变量,这是不允许的。

在第二个示例中,您尝试将两个相同的键放入HashMap,这将导致只添加一个键(因为不允许重复键),第二个put 语句将覆盖原来的PdfPTable 值与第二个 PdfPTable 值。

【讨论】:

    【解决方案3】:

    这是一个语法问题,你不能有两个同名的变量。 编译器不允许这样做并说“重复局部变量”。

    看看this

    【讨论】:

      【解决方案4】:

      如果你想调用testObj1.ToString();,这段代码会在局部变量中产生歧义,你实际上会调用什么对象?

      PdfPTable testObj1 = new PdfPTable(6);
      PdfPTable testObj1 = new PdfPTable(6);
      

      for 循环,你创建了两个匿名对象,没有变量名,因此你让 hashmap 保存对它们的引用,而不是一个变量。逻辑上你的两个例子不匹配,代码可以简单地更改为以下,然后在逻辑上做同样的事情。

      PdfPTable testObj1 = new PdfPTable(6);
      PdfPTable testObj2 = new PdfPTable(6);
      

      【讨论】:

        【解决方案5】:

        在第一种情况下,您要创建两个具有相同名称的变量并为其赋值。因此会导致编译时的名称冲突。

        在第二种情况下,您只是将值存储到哈希映射中,键为字符串。这里它与变量名无关。你也可以这样写,

        String testObj1 = "testObj1";
        hash.put(testObj1, new PdfPTable(6));
        hash.put(testObj1, new PdfPTable(6));
        

        很明显,它与变量声明或任何命名约定无关。但是如果用这种方式声明 testObj1 两次或更多次,

        String testObj1 = "testObj1";
        String testObj1 = "testObj1";
        

        这会再次导致您在编译时发生命名冲突。

        允许在 hashmap 中使用相同的键存储值,它会替换值。

        对于每个未存储的 key ,总是有一个分配的值,它是空的。 put() 方法总是返回相应键的前一个值。

        假设我们通过这种方式存储要映射的值,

        Map<String, String> hashMap = new HashMap<>();
        String previousValue = hashMap.put("key1","value1");
        //previousValue would be null.
        previousValue = hashMap.put("key1","value2");
        //Now previous value would be "value1"
        previousValue = hashMap.put("key1","value3");
        //Now previous value would be "value2"
        

        所以,很明显,使用相同的键存储值是允许的,它只是将以前的值覆盖到我们提供的值。

        【讨论】:

          【解决方案6】:

          由于重复的局部变量,编译器显示错误。

          在第二个中,您只是将密钥设置为“testObj”,这是有效的。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-09-20
            • 2019-03-04
            • 2021-08-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多