当前位置: 首页 > 知识库问答 >
问题:

java - HashMap的keySet()、values(),不遍历只打印,键值对不对应?

贺雪松
2024-08-26

HashMap中keySet()、values(),不遍历只打印,键值对不对应?

public class test {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();
        map.put("Aa",1);
        map.put("BB",2);
        map.put("3",3);
        map.put("4",4);

        System.out.println(map.keySet());
        System.out.println(map.values());
    }
}

输出的结果是,结果看是对应的

[Aa, BB, 3, 4]
[1, 2, 3, 4]

gpt给出的解答是

在这个输出中,键和值似乎顺序匹配,但这仅仅是巧合。HashMap 的内部结构决定了其遍历顺序是不可预测的。虽然目前表现正常,但在某些情况下(例如,插入数据顺序不同、哈希冲突、重新哈希等情况下),keySet() 和 values() 的顺序可能不会对应。

求大佬解答,该怎么验证

共有1个答案

司徒宏远
2024-08-26

顺序是一样的。

OpenJDK 是开源的,直接看源码就好了:

https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/util/HashMap.java#L1627-L1640

keySet()values()entrySet() 三者调用的都是同一个 nextNode() 方法,同一个迭代器,顺序当然是一样的了。

我们讲 HashMap 顺序不固定一般指的是插入和遍历之间的顺序比较,而不是遍历键和遍历值之间的顺序比较。

但是有一个问题是,JDK 的 API 规范里并没有明确指出过,这三个遍历方法的顺序一定是保持一致的。也就是说,虽然现在你看到 OpenJDK/OracleJDK 现在是这样实现的,但不排除以后某个版本更新或者其他 JDK 的实现里,它顺序就变了(虽然我个人觉得这种可能性几乎没有)。因此从开发的角度来说,尽量不要依赖这种未定义的行为。如果你真的需要同时遍历键和值、且需要顺序保持一致,不是也提供了 entrySet() 方法么。

 类似资料:
  • 问题内容: 迭代中的项目的最佳方法是HashMap什么? 问题答案: 像这样遍历: 了解更多有关。

  • 问题内容: 如果您能帮助回答以下问题,我将不胜感激: 我已经使用Java以非常标准的方式创建了一个自定义链接列表。以下是我的课程: 我试图打印值我已经插入到列表如下 但是我从IDE获得的输出是 为什么打印出引用,而不打印出诸如bat,ant,rat …之类的字符串的实际值? 如果我想打印出实际值,那该怎么办? 非常感谢你 问题答案: 您的课程已经为您创建了! 将打印

  • 我的数组正在加载,并且正在按计划(按照它们在文件中出现的顺序)将卡打印出来。当我尝试在单独的方法中循环遍历arraylist以检查数据是否存在时,它只打印最后一个对象而不是每个对象。有人能告诉我为什么吗? 加载法 和getAll()方法 运行时,它只打印出.txt文件中的最后一张牌“KS”(黑桃之王)。有人能告诉我为什么会这样吗? 谢谢 }

  • 我有这个JSON: 我想打印键值对,其中键匹配状态和选项,以及时间和它的值。我可以通过使用下面的命令打印时间和所有键值对,但不确定如何提取特定的键值对。 这将产生以下输出: 但我想要的结果是:

  • 问题内容: 我试图简单地在ConcurrentHashMap中打印所有键/值对。 我在网上发现了我认为可以做到的代码,但似乎正在获取有关存储桶/哈希码的信息。老实说,实际上输出的结果很奇怪,可能是我的程序不正确,但是我首先要确保这部分是我要使用的部分。 这给出了大约10个不同键的输出,计数似乎是映射中总插入次数的总和。 问题答案: 我测试了您的代码并正常工作。我添加了一个小演示,它用另一种方式打印

  • 问题内容: 从Javascript 1.7开始,有一个Iterator对象,它允许这样做: node.js中是否有类似的东西? 现在我正在使用: 但这通过将所有对象密钥存储在中而产生大量开销。 问题答案: 您想要的是对象或数组上的延迟迭代。这在ES5中是不可能的(因此在node.js中是不可能的)。我们最终会得到这个。 唯一的解决方案是找到一个扩展V8的节点模块,以实现迭代器(可能还有生成器)。我