📜  JavaTreeMap、HashMap和LinkedHashMap的区别

📅  最后修改于: 2021-09-12 11:30:21             🧑  作者: Mango

先决条件: 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 
    0implements Map
    • LinkedHashMap 包含基于键的值。
    • 它只包含独特的元素。
    • 它可能有一个空键和多个空值。
    • 它与 HashMap 相同,而是维护插入顺序
  3. TreeMap: TreeMap 提供O(log N)查找和插入。键是有序的,所以如果你需要按排序的顺序遍历键,你可以。这意味着键必须实现 Comparable 接口。 TreeMap 由红黑树实现。
    句法:
    public class TreeMap extends AbstractMap implements
    NavigableMap, Cloneable, Serializable
    • TreeMap 包含基于键的值。它实现了 NavigableMap 接口并扩展了 AbstractMap 类。
    • 它只包含独特的元素。
    • 它不能有空键,但可以有多个空值。
    • 它与 HashMap 相同,而是保持升序(使用其键的自然顺序排序)。
  4. 哈希表: “哈希表”是基于哈希的映射的通用名称。
    句法:
    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

比较表

现实生活中的应用

  1. 假设您正在创建名称到 Person 对象的映射。您可能希望按姓名按字母顺序定期输出人员。 TreeMap 可以让你做到这一点。
  2. TreeMap 还提供了一种方法,可以根据名称输出接下来的 10 个人。这对于许多应用程序中的“更多”函数很有用。
  3. 当您需要键的排序以匹配插入的顺序时,LinkedHashMap 很有用。当您想要删除最旧的项目时,这在缓存情况下可能很有用。
  4. 通常,除非有理由不这样做,否则您会使用 HashMap。也就是说,如果您需要按插入顺序取回键,则使用 LinkedHashMap。如果您需要按真实/自然顺序取回键,请使用 TreeMap。否则,HashMap 可能是最好的。它通常更快并且需要更少的开销。