我正在学习 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 的实际行为。我读了一些关于重新调整大小和重新哈希的文档,也许对我来说太难理解了。
我也看过一些帖子说这个问题,但我无法重现
我该如何理解这一点?
尝试了解 HashMap 的实际行为
您正在尝试了解HashMap的内部实现细节。 不要。
此类细节可能会随着任何新版本的发布而改变。程序员可以随时更改其实现,只要遵守 Javadoc 中承诺的契约即可。
如果 Javadoc 说您不能依赖特定的顺序,那么就不要依赖特定的顺序。
对于特定订单,请使用
SequencedMap
的实现。