Java集合类之Map

Map解释

Map 通过键值对来存储对象的一种数据结构。在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value。这就是我们平时说的键值对。

常用map类

  • HashMap
  • TreeMap

1. HashMap

1.1 介绍

HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。
HashMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。
HashMap 的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不是有序的。

1.2 注意

HashMap key均可以为null或”“。

1.3 实现

HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。

1.4 JDK8的特殊之处

  • 如果HashMap存储量足够大时,HashMap会动态的使用一个专门的treemap实现来替换掉它。这样做的结果使得get更好,是O(logn),而不是糟糕的O(n)。

  • 它是如何工作 的?前面产生冲突的那些KEY对应的记录只是简单的追加到一个链表后面,这些记录只能通过遍历来进行查找。但是超过这个阈值后HashMap开始将列表升 级成一个二叉树,使用哈希值作为树的分支变量,如果两个哈希值不等,但指向同一个桶的话,较大的那个会插入到右子树里。如果哈希值相等,HashMap希 望key值最好是实现了Comparable接口的,这样它可以按照顺序来进行插入。这对HashMap的key来说并不是必须的,不过如果实现了当然最 好。如果没有实现这个接口,在出现严重的哈希碰撞的时候,你就并别指望能获得性能提升了。

  • 这个性能提升有什么用处?比方说恶意的程序,如果它知道我们用的是哈希算法,它可能会发送大量的请求,导致产生严重的哈希碰撞。然后不停的访问这些 key就能显著的影响服务器的性能,这样就形成了一次拒绝服务攻击(DoS)。JDK 8中从O(n)到O(logn)的飞跃,可以有效地防止类似的攻击,同时也让HashMap性能的可预测性稍微增强了一些。

2. TreeMap

2.1 介绍

TreeMap类不仅实现了Map接口,还实现了Map接口的子接口java.util.SortedMap。由TreeMap类实现的Map集合,不允许键对象为null,因为集合中的映射关系是根据键对象按照一定顺序排列的。

2.2 注意

TreeMap key不允许为null,可以为”“。

2.3 实现

TreeMap 由红黑树算法实现。什么是红黑树可以百度,或者参考这篇博客。

代码测试

package com.loongshaw;

import java.util.HashMap;
import java.util.Iterator;
import java.util.TreeMap;

public class MapComparation {

    public static void hashMapTest(){

        HashMap hashmap = new HashMap();

        hashmap.put("", "");
        hashmap.put("cn", "China");
        hashmap.put("jp", "Japen");
        hashmap.put("fr", "France");
        hashmap.put("USA", "America");

        System.out.println("-------------HashMap输出--------------");  
        System.out.println(hashmap);  
        System.out.println("cn:" + hashmap.get("cn"));  
        System.out.println(hashmap.containsKey("cn"));  
        System.out.println(hashmap.keySet());  
        System.out.println(hashmap.isEmpty()); 

        //采用Iterator遍历HashMap 
        Iterator it = hashmap.keySet().iterator();  
        while(it.hasNext()) {  
            String key = (String)it.next();  
            System.out.println("key:" + key);  
            System.out.println("value:" + hashmap.get(key));  
        } 

        hashmap.remove("cn");  
        System.out.println(hashmap.containsKey("cn"));  

    }

    public static void treeMapTest(){

        TreeMap treemap = new TreeMap();

        treemap.put("", "");
        treemap.put("", null);
        treemap.put("cn", "China");
        treemap.put("jp", "Japen");
        treemap.put("fr", "France");
        treemap.put("USA", "America");

        System.out.println("-------------TreeMap输出--------------");  
        System.out.println(treemap);  
        System.out.println("cn:" + treemap.get("cn"));  
        System.out.println(treemap.containsKey("cn"));  
        System.out.println(treemap.keySet());  
        System.out.println(treemap.isEmpty()); 

        //采用Iterator遍历HashMap 
        Iterator it = treemap.keySet().iterator();  
        while(it.hasNext()) {  
            String key = (String)it.next();  
            System.out.println("key:" + key);  
            System.out.println("value:" + treemap.get(key));  
        } 

        treemap.remove("cn");  
        System.out.println(treemap.containsKey("cn"));  

    }

    public static void main(String[] args){

        hashMapTest();
        treeMapTest();
    }

}

运行结果

-------------HashMap输出--------------
{=, USA=America, jp=Japen, cn=China, fr=France}
cn:China
true
[, USA, jp, cn, fr]
false
key:
value:
key:USA
value:America
key:jp
value:Japen
key:cn
value:China
key:fr
value:France
false
-------------TreeMap输出--------------
{=null, USA=America, cn=China, fr=France, jp=Japen}
cn:China
true
[, USA, cn, fr, jp]
false
key:
value:null
key:USA
value:America
key:cn
value:China
key:fr
value:France
key:jp
value:Japen
false

你可能感兴趣的:(java,HashMap,TreeMap)