Java中TreeMap,HashMap和LinkedHashMap的区别

先决条件: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,    
// 键按排序顺序排列

比较表

实际应用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值