Java中TreeMap、HashMap和LinkedHashMap的区别
TreeMap, HashMap和LinkedHashMap:有什么相似之处?
- 所有这些都提供了一个key->值映射和一种遍历键的方法。这些类之间最重要的区别是时间保证和键的排序。
- 所有三个类HashMap、TreeMap和LinkedHashMap实现了java.util.Map接口,并表示从唯一键到值的映射。
HashMap
HashMap提供0(1)个查找和插入。但是,如果遍历键,键的顺序基本上是任意的。它是由一个链表数组实现的。
语法:
- HashMap包含基于键的值。
- 它只包含独特的元素。
- 它可以有一个空键和多个空值。
- 它没有秩序。
LinkedHashMap
LinkedHashMap提供0(1)个查找和插入。键按插入顺序排序。它是通过双链接桶实现的。
语法:
- LinkedHashMap包含基于键的值。
- 它只包含独特的元素。
- 它可以有一个空键和多个空值。
- 它与HashMap一样,只是维护插入顺序。
TreeMap
TreeMap提供O(log N)的查找和插入。键是有序的,所以如果需要按有序的顺序遍历键,可以这样做。这意味着键必须实现Comparable接口。TreeMap是由红黑树实现的。
语法:
- TreeMap包含基于键的值。它实现了NavigableMap接口并扩展了AbstractMap类。
- 它只包含独特的元素。
- 它不能有空键,但可以有多个空值。
- 这与HashMap保持升序相同(使用其键的自然顺序排序)。
Hashtable
“Hashtable”是基于哈希的映射的通用名称。
语法:
- 哈希表是一个列表数组。每个列表被称为一个桶。bucket的位置通过调用hashcode()方法来确定。哈希表包含基于键的值。
- 它只包含独特的元素。
- 它可能没有任何空键或值。
- 它是同步的。
- 它是一个遗留类。
HashMap
LinkedHashMap
TreeMap
HashMap的输出:
LinkedHashMap的输出:
TreeMap的输出:
比较表
现实生活中应用
- 假设您正在创建名称到Person对象的映射。您可能希望按姓名的字母顺序定期输出人员。TreeMap可以让你做到这一点。
- TreeMap还提供了一种方法,只要给定一个名字,就可以输出接下来的10个人。这对于“More”函数在许多应用程序中都很有用。
- 当您需要键的顺序来匹配插入顺序时,LinkedHashMap非常有用。在缓存情况下,当您想要删除最旧的项时,这可能很有用。
- 通常情况下,除非有不使用HashMap的理由,否则您会使用HashMap。也就是说,如果您需要按插入顺序取回键,那么可以使用LinkedHashMap。如果您需要以真实/自然的顺序获得键,那么使用TreeMap。否则,HashMap可能是最好的。它通常更快,需要的开销更少。