Java HashMap迭代Map.Entry<> vs Entry<>

时间:2015-02-13 00:45:36

标签: java dictionary hashmap iteration

我是Java新手,使用HashMap在Mac上编写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上会弹出一个错误,指示&#34;找不到符号:条目&#34;

后来我将代码更改为

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());
        }
    }
}

现在它运作正常。

有人可以告诉我为什么吗?
为什么这段代码在其他计算机上工作正常,但在我的计算机上却没有?

2 个答案:

答案 0 :(得分:1)

您提供的代码也不会在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();

希望这有帮助。

答案 1 :(得分:0)

你确定这会在windows中编译吗?

我把它放在一个名为&#34; C:\ tmp \ etc \ Test.java&#34;的文件中。然后这样做了......

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>

你必须做一些导致这种情况的事情......