Java HashMap 迭代顺序 - 尽管文档另有说明,但行为似乎是一致的

问题描述 投票:0回答:1

我正在学习 Java 中的 HashMap,我对迭代顺序感到困惑。文档指出,HashMap 不保证任何特定的迭代顺序,但在我的简单测试中,顺序似乎保持一致:

此类不保证地图的顺序;特别是,它不保证顺序随着时间的推移保持不变。 Java 11 文档

import java.util.HashMap;

public class HashMapDemo {
    public static void main(String[] args) {
        HashMap<String, String> dishes = new HashMap<>();

        // Adding more elements with complex keys
        dishes.put("dish-1234", "Pho");
        dishes.put("dish-5678", "Spicy Beef Noodle Soup");
        dishes.put("dish-9012", "Broken Rice");
        dishes.put("dish-3456", "Banh Mi");
        dishes.put("dish-7890", "Hu Tieu");
        dishes.put("dish-2345", "Mi Quang");
        dishes.put("dish-6789", "Crab Noodle Soup");
        dishes.put("dish-0123", "Rolled Rice Cake");

        System.out.println("First time:");
        dishes.forEach((id, name) -> System.out.println(id + ": " + name));

        // Create new HashMap with same data
        HashMap<String, String> dishes2 = new HashMap<>();
        dishes2.putAll(dishes);

        System.out.println("\nSecond time (New HashMap):");
        dishes2.forEach((id, name) -> System.out.println(id + ": " + name));
    }
}

输出:

First time:
dish-7890: Hu Tieu
dish-3456: Banh Mi
dish-2345: Mi Quang
dish-1234: Pho
dish-0123: Rolled Rice Cake
dish-5678: Spicy Beef Noodle Soup
dish-9012: Broken Rice
dish-6789: Crab Noodle Soup

Second time (New HashMap):
dish-7890: Hu Tieu
dish-3456: Banh Mi
dish-2345: Mi Quang
dish-1234: Pho
dish-0123: Rolled Rice Cake
dish-5678: Spicy Beef Noodle Soup
dish-9012: Broken Rice
dish-6789: Crab Noodle Soup

我知道如果我需要保证顺序,我应该使用 LinkedHashMap 或 TreeMap,但我试图了解 HashMap 的实际行为。我读了一些关于重新调整大小和重新哈希的文档,也许对我来说太难理解了。

我也看过一些帖子说这个问题,但我无法重现

我该如何理解这一点?

java hashmap java-11
1个回答
0
投票

尝试了解 HashMap 的实际行为

您正在尝试了解HashMap的内部实现细节。 不要。

此类细节可能会随着任何新版本的发布而改变。程序员可以随时更改其实现,只要遵守 Javadoc 中承诺的契约即可。

如果 Javadoc 说您不能依赖特定的顺序,那么就不要依赖特定的顺序。

对于特定订单,请使用

SequencedMap
的实现。

© www.soinside.com 2019 - 2024. All rights reserved.