sunny123456

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

在Java中,Map 接口的实现(如 HashMap,LinkedHashMap,TreeMap 等)并不保证遍历 keySet() 或 entrySet() 时的顺序。但是,某些特定的 Map 实现确实提供了特定的遍历顺序。
1、HashMap:它基于哈希表实现,并不保证映射的顺序,特别是遍历顺序。因此,当你使用 map.keySet() 遍历 HashMap 时,结果可能会看起来像是“倒序”或“随机”的,但这并不是真正的倒序或随机,而是基于哈希表和内部数组结构的结果。
2、LinkedHashMap:它维护了一个运行于所有条目的双向链表。此链表定义了迭代顺序,通常是按照条目插入到映射中的顺序(插入顺序)。注意,如果此映射由于重新插入(重新插入键/值对)而导致结构修改,则迭代顺序可能会受到影响。
3、TreeMap:它基于红黑树实现,可以保证按照键的自然顺序或创建 TreeMap 时提供的 Comparator 进行排序。
如果你发现你的 Map 遍历结果看起来像是“倒序”的,并且你没有使用 LinkedHashMap 或 TreeMap,那么这可能是由于你使用的 Map 实现(很可能是 HashMap)的内部结构导致的。

为了获得特定的遍历顺序,你应该选择适当的 Map 实现。如果你想要保持插入顺序,那么应该使用 LinkedHashMap。如果你想要按照键的排序顺序遍历,那么应该使用 TreeMap。

   TreeMap<String, Integer> treeMap = new TreeMap<>(new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            // 这里我们按照字符串长度的逆序来排序
            return Integer.compare(o2.length(), o1.length());
        }
    });
    treeMap.put("one", 1);
    treeMap.put("two", 2);
    treeMap.put("three", 3);
    treeMap.put("four", 4);

    // 输出结果将按照键的字符串长度的逆序来排序
    treeMap.forEach((key, value) -> System.out.println("treeMap "+key + ": " + value));
    System.out.println("treeMap 自定义排序规则 按照字符串长度的逆序来排序");
posted on 2024-07-03 19:46  sunny123456  阅读(4)  评论(0编辑  收藏  举报