Java中HashMap和TreeMap之间的区别

Java中的HashMap和TreeMap

首先,我们将看到TreeMap与Java中的HashMap有何不同?

TreeMap 树图

  • 此类在java.util包中可用。

  • 此类是Map接口的实现类。

  • TreeMap的基础数据结构是RED-BLACK树。

  • 在TreeMap中,不会保留“元素的插入顺序”,因为将根据键的某些排序顺序插入元素(此处将根据键进行排序)。

  • 在TreeMap中,对象表示为一组作为键值对的元素。

  • 在TreeMap中,键“不能重复插入”(即,不允许插入键的重复元素)。

  • 在TreeMap中,值可以“重复插入”(即,允许为值插入重复元素,或者对值没有限制)。

  • 在TreeMap中,排序将分为两种类型:

    1. 默认自然排序(升序)

    2. 自定义排序(升序或降序)

  • 在默认情况下,自然排序的“ TreeMap关键字”应该是同质且可比较的。

  • 在自定义排序中,“ TreeMap键”不必是同质的和可比较的。

  • 在TreeMap中,将键作为第一个元素“可以插入空”,换句话说,如果我们将在第一个元素之后插入null,则将获得异常。

  • 在TreeMap中,非空Map的键“不可能插入空”。

示例

//Java程序演示TreeMap的行为 

import java.util.*;

class TreeMapClass {
    public static void main(String[] args) {
        //创建TreeMap的实例
        TreeMap tm = new TreeMap();

        //通过put()在TreeMap中添加元素
        tm.put(1, "Java");
        tm.put(3, "C");
        tm.put(2, "C++");
        tm.put(4, "Java");
        tm.put(6, null);
        tm.put(7, 10);
        tm.put(2, "Ruby");

        /*  tm.put("Java" , "is a programming"); 
            Here hetrogenous object is not allowed for keys */

        /*  tm.put(null , "Python"); 
            Here null insertion for keys is not 
            possible for non-empty TreeMap */

        /*  tm.put(2 , "Ruby"); 
            Here we will not get any exception but 
            only one will be considerable */

        //显示当前TreeMap-
        System.out.println("Display Current TreeMap is :" + tm);
    }
}

输出结果

E:\Programs>javac TreeMapClass.java

E:\Programs>java TreeMapClass
Display Current TreeMap is :{1=Java, 2=Ruby, 3=C, 4=Java, 6=null, 7=10}

其次,我们将看到HashMap与Java中的TreeMap有何不同?

HashMap 哈希映射

  • 此类在java.util包中可用。

  • 此类是Map接口的实现类。

  • HashMap的基础数据结构是Hashtable。

  • HashMap是LinkedHashMap的父级。

  • 在HashMap中,“元素的插入顺序”未保留,因为将根据某些键的hashCode插入元素(即,插入顺序不必与检索顺序相同)。

  • 在HashMap中,对象表示为一组作为键值对的元素。

  • 在HashMap中,键“不能重复插入”(即不允许插入键的重复元素)。

  • 在HashMap中,值可以“重复插入”(即,允许为值插入重复元素,或者对值没有限制)。

  • 在HashMap中,键和值“可以空插入”,但键一次,值多个。

  • 在HashMap中,键和值均允许使用“异构对象”。

示例

//Java程序演示HashMap的行为 

import java.util.Collection;
import java.util.HashMap;

class HashMapClass {
    public static void main(String[] args) {
        //创建一个HashMap的实例
        HashMap hm = new HashMap();

        //通过使用put()方法在HashMap中添加一些值
        hm.put("Java", 1000);
        hm.put("C", 2000);
        hm.put("C++", 3000);
        hm.put("Ruby", 4000);
        hm.put("Python", 1000);
        hm.put("null", null);
        hm.put("Django", null);

        /*  hm.put("null",null); 
            这里我们不会得到任何错误,但是键接受一个空值*/

        //显示HashMap的检索顺序
        System.out.println("Current HashMap list is :" + hm);

        //通过使用values()查找HashMap的值
        Collection values = hm.values();

        //显示HashMap的值
        System.out.println("Current HashMap Key values is :" + values);
    }
}

输出结果

E:\Programs>javac HashMapClass.java

E:\Programs>java HashMapClass
Current HashMap list is :{Ruby=4000, C=2000, Django=null, Python=1000, 
C++=3000, null=null, Java=1000}
Current HashMap Key values is :[4000, 2000, null, 1000, 3000, null, 1000].