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