Java中TreeMap、HashMap和LinkedHashMap的区别
TreeMap, HashMap和LinkedHashMap:有什么相似之处?
- 所有这些都提供了一个key->值映射和一种遍历键的方法。这些类之间最重要的区别是时间保证和键的排序。
- 所有三个类HashMap、TreeMap和LinkedHashMap实现了java.util.Map接口,并表示从唯一键到值的映射。
HashMap
HashMap提供0(1)个查找和插入。但是,如果遍历键,键的顺序基本上是任意的。它是由一个链表数组实现的。
语法:
public class HashMap extends AbstractMap
implements Map,Cloneable, Serializable
- HashMap包含基于键的值。
- 它只包含独特的元素。
- 它可以有一个空键和多个空值。
- 它没有秩序。
LinkedHashMap
LinkedHashMap提供0(1)个查找和插入。键按插入顺序排序。它是通过双链接桶实现的。
语法:
public class LinkedHashMap extends HashMap
implements Map
- LinkedHashMap包含基于键的值。
- 它只包含独特的元素。
- 它可以有一个空键和多个空值。
- 它与HashMap一样,只是维护插入顺序。
TreeMap
TreeMap提供O(log N)的查找和插入。键是有序的,所以如果需要按有序的顺序遍历键,可以这样做。这意味着键必须实现Comparable接口。TreeMap是由红黑树实现的。
语法:
public class TreeMap extends AbstractMap implements
NavigableMap, Cloneable, Serializable
- TreeMap包含基于键的值。它实现了NavigableMap接口并扩展了AbstractMap类。
- 它只包含独特的元素。
- 它不能有空键,但可以有多个空值。
- 这与HashMap保持升序相同(使用其键的自然顺序排序)。
Hashtable
“Hashtable”是基于哈希的映射的通用名称。
语法:
public class Hashtable extends Dictionary implements
Map, Cloneable, Serializable
- 哈希表是一个列表数组。每个列表被称为一个桶。bucket的位置通过调用hashcode()方法来确定。哈希表包含基于键的值。
- 它只包含独特的元素。
- 它可能没有任何空键或值。
- 它是同步的。
- 它是一个遗留类。
HashMap
// Java program to print ordering
// of all elements using HashMap
import java.util.*;
import java.lang.*;
import java.io.*;
class Main
{
// This function prints ordering of all elements
static void insertAndPrint(AbstractMap<Integer, String> map)
{
int[] array= {1, -1, 0, 2,-2};
for (int x: array)
{
map.put(x, Integer.toString(x));
}
for (int k: map.keySet())
{
System.out.print(k + ", ");
}
}
// Driver method to test above method
public static void main (String[] args)
{
HashMap<Integer, String> map = new HashMap<Integer, String>();
insertAndPrint(map);
}
}
LinkedHashMap
// Java program to print ordering
// of all elements using LinkedHashMap
import java.util.*;
import java.lang.*;
import java.io.*;
class Main
{
// This function prints ordering of all elements
static void insertAndPrint(AbstractMap<Integer, String> map)
{
int[] array= {1, -1, 0, 2,-2};
for (int x: array)
{
map.put(x, Integer.toString(x));
}
for (int k: map.keySet())
{
System.out.print(k + ", ");
}
}
// Driver method to test above method
public static void main (String[] args)
{
LinkedHashMap<Integer, String> map = new LinkedHashMap<Integer, String>();
insertAndPrint(map);
}
}
TreeMap
// Java program to print ordering of
// all elements using TreeMap
import java.util.*;
import java.lang.*;
import java.io.*;
class Main
{
// This function prints ordering of all elements
static void insertAndPrint(AbstractMap<Integer, String> map)
{
int[] array= {1, -1, 0, 2,-2};
for (int x: array)
{
map.put(x, Integer.toString(x));
}
for (int k: map.keySet())
{
System.out.print(k + ", ");
}
}
// Driver method to test above method
public static void main (String[] args)
{
TreeMap<Integer, String> map = new TreeMap<Integer, String>();
insertAndPrint(map);
}
}
HashMap的输出:
-1, 0, 1, -2, 2,
// ordering of the keys is essentially arbitrary (any ordering)
LinkedHashMap的输出:
1, -1, 0, 2, -2,
// Keys are ordered by their insertion order
TreeMap的输出:
-2, -1, 0, 1, 2,
// Keys are in sorted order
比较表
现实生活中应用
- 假设您正在创建名称到Person对象的映射。您可能希望按姓名的字母顺序定期输出人员。TreeMap可以让你做到这一点。
- TreeMap还提供了一种方法,只要给定一个名字,就可以输出接下来的10个人。这对于“More”函数在许多应用程序中都很有用。
- 当您需要键的顺序来匹配插入顺序时,LinkedHashMap非常有用。在缓存情况下,当您想要删除最旧的项时,这可能很有用。
- 通常情况下,除非有不使用HashMap的理由,否则您会使用HashMap。也就是说,如果您需要按插入顺序取回键,那么可以使用LinkedHashMap。如果您需要以真实/自然的顺序获得键,那么使用TreeMap。否则,HashMap可能是最好的。它通常更快,需要的开销更少。