【问题标题】:Java HashMap iteration Map.Entry<> vs Entry<>Java HashMap 迭代 Map.Entry<> vs Entry<>
【发布时间】:2015-04-13 23:13:09
【问题描述】:

我是 Java 新手,在 Mac 上使用 HashMap 编写 Java。
但是我遇到了一个我找不到答案的问题

import java.util.Map;
import java.util.HashMap;

public class Test {
    public static void main(String[] args) {
        Map<String, Integer> hm = new HashMap<>();
        hm.put("a", 1);
        hm.put("b", 2);
        for (Entry<String, Integer> en : hm.entrySet()) {  //this line is different
            System.out.print(en.getKey());
            System.out.println(en.getValue());
        }
    }
}

此代码在 Windows 机器上运行良好,但在我的 Mac 上它会弹出一个错误提示“找不到符号:条目”

后来我把代码改成了

import java.util.Map;
import java.util.HashMap;

public class Test {
    public static void main(String[] args) {
        Map<String, Integer> hm = new HashMap<>();
        hm.put("a", 1);
        hm.put("b", 2);
        for (Map.Entry<String, Integer> en : hm.entrySet()) {  //this line is different
            System.out.print(en.getKey());
            System.out.println(en.getValue());
        }
    }
}

现在它可以正常工作了。

谁能告诉我为什么?
为什么这段代码在其他计算机上运行良好,而在我的计算机上却不行?

【问题讨论】:

  • 因为你没有导入Entry
  • 在第二组代码中,您实际上是在告诉编译器迭代是针对 'java.util.Map.Entry' 第一个条目未指定。您是在 IDE 中执行此操作吗?如果您还导入了'java.util.Map.Entry',第一个可能会起作用
  • @immibis Entry是接口Map的内部类,不需要导入。
  • @hiren 你可以导入Entry,也可以导入MapMap.Entry,或者你也可以不导入写java.util.Map.Entry
  • @hiren Entry 是一个内部接口,它们是自动静态的 - 所以你必须导入它们。

标签: java dictionary hashmap iteration


【解决方案1】:

你确定这可以在 windows 中编译吗?

我只是把它放在一个名为“C:\tmp\etc\Test.java”的文件中,然后这样做......

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\Users\Bret>cd \tmp\etc

C:\tmp\etc>javac Test.java
Test.java:9: error: cannot find symbol
    for (Entry<String, Integer> en : hm.entrySet()) {  //this line is different
         ^
  symbol:   class Entry
  location: class Test
1 error

C:\tmp\etc>

你一定是在做其他事情导致这个......

【讨论】:

    【解决方案2】:

    您提供的代码也无法在 Windows 上编译。 不确定您可能正在编译其他内容。 如果您使用控制台并尝试编译并且文件名相似,则可能会发生事情。

    Map.Entry 位于 java.util.Map 包中。 所以,我的建议是

    1.您可以在代码中导入java.util.Map.Entry

    2. 使用 Map.Entry 而不仅仅是 Entry,例如:

    for (Map.Entry<String, Integer> en : hm.entrySet())
    

    基本上,当您使用 Map.Entry 时,您会直接引用该类。 Java 的 import 语句是纯语法糖。 import 仅在编译时进行评估,以指示编译器在哪里可以找到代码中的名称。

    当你总是指定类的完整限定名时,你可能没有任何 import 语句。就像这一行根本不需要 import 语句:

    javax.swing.JButton but = new  javax.swing.JButton();
    

    import 语句将使您的代码更具可读性,如下所示:

    import javax.swing.*
    JButton but = new JButton();
    

    希望这会有所帮助。

    【讨论】:

    • 感谢 JustAditya,我在 Win 上使用了 IDE。现在我知道我错在哪里了~
    猜你喜欢
    • 1970-01-01
    • 2015-09-19
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    相关资源
    最近更新 更多