先决条件: Java的HashMap 和 TreeMap
TreeMap、HashMap 和 LinkedHashMap:有什么相似之处?
- 所有这些都提供了一个键-> 值映射和一种遍历键的方法。这些类之间最重要的区别是时间保证和键的排序。
- 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 0implements Map
- LinkedHashMap 包含基于键的值。
- 它只包含独特的元素。
- 它可能有一个空键和多个空值。
- 它与 HashMap 相同,而是维护插入顺序。
- TreeMap: TreeMap 提供O(log N)查找和插入。键是有序的,所以如果你需要按排序的顺序遍历键,你可以。这意味着键必须实现 Comparable 接口。 TreeMap 由红黑树实现。
句法:public class TreeMap extends AbstractMap implements NavigableMap, Cloneable, Serializable
- TreeMap 包含基于键的值。它实现了 NavigableMap 接口并扩展了 AbstractMap 类。
- 它只包含独特的元素。
- 它不能有空键,但可以有多个空值。
- 它与 HashMap 相同,而是保持升序(使用其键的自然顺序排序)。
- 哈希表: “哈希表”是基于哈希的映射的通用名称。
句法:public class Hashtable extends Dictionary implements Map, Cloneable, Serializable
- Hashtable 是一个列表数组。每个列表称为一个桶。通过调用 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 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 map = new HashMap();
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 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 map = new LinkedHashMap();
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 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 map = new TreeMap();
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 个人。这对于许多应用程序中的“更多”函数很有用。
- 当您需要键的排序以匹配插入的顺序时,LinkedHashMap 很有用。当您想要删除最旧的项目时,这在缓存情况下可能很有用。
- 通常,除非有理由不这样做,否则您会使用 HashMap。也就是说,如果您需要按插入顺序取回键,则使用 LinkedHashMap。如果您需要按真实/自然顺序取回键,请使用 TreeMap。否则,HashMap 可能是最好的。它通常更快并且需要更少的开销。