Java 中 TreeMap、HashMap 和 LinkedHashMap 之间有什么区别?
HashSet 和 ArrayList 都是 Java 集合框架中最重要的类之一。
以下是 TreeMap、HashMap 和 LinkedHashMap 之间的重要区别。
序号 | 键 | TreeMap | HashMap | LinkedHashMap |
---|---|---|---|---|
1 | 元素顺序 | 插入到 TreeMap 中的元素根据其键的自然顺序排序,或者根据在映射创建时提供的 Comparator 排序,具体取决于使用哪个构造函数。 | 对于 HashMap,它不保证映射的顺序,也不保证顺序会随着时间的推移保持不变。 | LinkedHashMap 遵循元素的插入顺序,并维护插入到其中的元素的顺序。 |
2 | 内部实现 | TreeMap 的内部实现不允许存储 null 键,但仅允许 null 值。 | 对于 HashMap,允许存储一个 null 键以及多个 null 值。 | LinkedHashmap 在内部实现方面更类似于 HashMap,因此允许存储一个 null 键和多个 null 值。 |
3 | 操作复杂度 | TreeMap 的 get、put 和 remove 操作的复杂度为 O(log(n)),这大于 HashMap。 | 另一方面,HashMap 在其 get、put 和 remove 操作的情况下复杂度为 O(1)。 | LinkedHashMap 的复杂度与 HashMap 相同,即 O(1)。 |
4 | 继承 | TreeMap 实现集合框架的 SortedMap 接口,它是 Map 的子接口。在内部,TreeMap 实现红黑树(一种自平衡二叉搜索树)。 | 另一方面,HashMap 实现简单的 Map 接口,并在内部使用散列来存储和检索其元素。 | 与 TreeMap 类似,LinkedHashMap 扩展 HashMap,并在内部使用散列,就像在 HashMap 中一样。 |
5 | 索引性能 | TreeMap 维护其元素的顺序,因此索引性能较低,并且需要的内存也比 HashMap 和 LinkedHashMap 多。 | HashMap 不维护任何元素的插入顺序,因此与 TreeMap 相比速度更快,并且不根据其值对元素进行排序,因此也比 LinkedHashMap 快。 | LinkedHashMap 比 TreeMap 快,但比 HashMap 慢。 |
6 | 比较 | TreeMap 中的元素通过使用 compareTo() 方法进行比较,其中也可以提供自定义实现。 | 另一方面,HashMap 使用 Object 类的 compare() 方法来比较其元素。 | LinkedHashMap 也使用 Object 类的 compare() 方法来比较其元素。 |
TreeMap 与 HashMap 与 LinkedHashMap 的示例
JavaTester.java
// Java program to print ordering // of all elements using HashMap import java.util.*; import java.lang.*; import java.io.*; public class JavaTester{ static void getAndShow(AbstractMap map){ int[] input= {1, -1, 0, 2,-2}; for (int x: input){ map.put(x, Integer.toString(x)); } Set<Integer> keySet = map.keySet(); for (int k: keySet){ System.out.print(k + ", "); } } public static void main (String[] args){ HashMap map = new HashMap(); getAndShow(map); LinkedHashMap map1 = new LinkedHashMap(); getAndShow(map1); TreeMap map2 = new TreeMap(); getAndShow(map2); } }
输出
-1, 0, 1, -2, 2, 1, -1, 0, 2, -2, -2, -1, 0, 1, 2,
广告