测试你对HashMap、LinkedHashMap和TreeMap的掌握程度
HashMap基于哈希表实现,在理想情况下插入和查找的时间复杂度都是O(1)。HashMap不保证元素顺序,允许null键和null值,且不是线程安全的。
HashMap中键是唯一的,当使用相同的键"a"再次put时,会覆盖原来的值。所以最终map中有2个键值对:("a", 3)和("b", 2),map.get("a")返回3。
LinkedHashMap继承自HashMap,主要区别是它维护了一个双向链表来保持元素的插入顺序或访问顺序。这使得遍历LinkedHashMap时能够按照可预测的顺序进行。
LinkedHashMap的构造函数LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)中,第三个参数accessOrder为true时表示按访问顺序排列,为false时按插入顺序排列。
TreeMap基于红黑树(Red-Black Tree)实现,这是一种自平衡的二叉搜索树。红黑树保证了插入、删除和查找操作的时间复杂度都是O(log n),同时维护元素的有序性。
TreeMap不允许null键,因为它需要对键进行比较来维护排序。如果键为null,比较操作会抛出NullPointerException。但TreeMap允许null值。HashMap和LinkedHashMap都允许null键和null值。
TreeMap会自动按照键的自然顺序进行排序。对于Integer类型,自然顺序就是数值大小顺序,所以输出是1 2 3。
entrySet()方法返回Map中所有键值对的Set视图,每个元素都是Map.Entry类型。keySet()返回所有键的Set,values()返回所有值的Collection,getAll()不是Map接口的方法。
HashMap的查找性能最好,平均时间复杂度为O(1)。LinkedHashMap由于需要维护链表,性能略低于HashMap但仍是O(1)。TreeMap基于红黑树,查找时间复杂度为O(log n)。
TreeMap最适合需要有序键值对和范围查询的场景。它提供了firstKey()、lastKey()、subMap()等导航方法,可以进行范围查询。如果只需要快速查找,HashMap更合适;如果需要保持插入顺序,LinkedHashMap更合适。