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