Map-集合之间的关系

一、Map集合的继承关系

这里写图片描述

Map集合中的元素都是以Key-Value的形式存在的,每个类的实现方式也不是很相同,那么我们来看一下类之间的相同点和同点

比较 HashMap TreeMap HashTable LinkedHashMap
数据结构 数组+链表+红黑树 红黑树 数组+链表 数组+链表+红黑树
是否有序 无序 无序 无序 有序
初始容量 16 11 16
线程安全
  • HashMap根据key的hashCode值存储数据,大多数情况下可以通过直接定位到key-value的位置,因而具有很快的访问速度,但遍历顺序确实不确定的。HashMap最多只允许一条记录的键为null,允许多条记录的值为null。HashMap是非线程安全的,及任意时刻可以有多个线程同时写HashMap,可能会导致数据的不一致。如果需要满足线程安全,可以用Collections的synchronizedMap方法,或者使用CurrentHashMap。
  • HashTable与HashMap的插入和获取Key-Value的方式类似,所不同的是其继承自Dictionary,而且HashTable是一个线程安全的类。同样遍历HashTable得到的结果和我们添加Key-Value的顺序是不确定的,这也是因为put方法的特性决定的。
  • LinkedHashMap是LinkedHashMap是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定实现插入的,也可以在构造时带参数,按照访问次序排序
  • TreeMap实现了SortedMap接口,根据Map中保存的Key进行排序,默认情况下按键值的升序排序,也可以指定排序的比较器,当用Iterator遍历TreeMap遍历TreeMap,得到的记录是排过序的。如果使用排序的映射,建议使用TreeMap。在使用TreeMap时,key必须实现Comparable接口。

二、判断Map集合迭代有序性

package CollectionLearn;

import org.junit.Test;

import java.util.*;

public class MapTest {
    @Test
    public void HashMapTest(){
        Map<String,String> map = new HashMap<String,String>();
        for(int i = 0 ;i<5;i++){
            map.put("Key"+i,"Value"+i);
        }
        Set<String> set = map.keySet();
        for(String s:set){
            System.out.println(s+" "+map.get(s));
        }


    }
    @Test
    public void testLinkedHashMap(){
        Map<String,String> map = new LinkedHashMap<String,String>();
        for(int i = 0 ;i<5;i++){
            map.put("Key"+i,"Value"+i);
        }
        Set<String> set = map.keySet();
        for(String s:set){
            System.out.println(s+" "+map.get(s));
        }
    }

    @Test
    public void TestHashTable(){
        Map<String,String> map = new Hashtable<String,String>();
        for(int i = 0 ;i<15;i++){
            map.put("Key"+i,"Value"+i);
        }
        Set<String> set = map.keySet();
        for(String s:set){
            System.out.println(s+" "+map.get(s));
        }
    }

    @Test
    public void TestTreeMap(){
        Map<String,String> map = new TreeMap<String,String>();
        for(int i = 0 ;i<20;i++){
            map.put("Key"+i,"Value"+i);
        }
        Set<String> set = map.keySet();
        for(String s:set){
            System.out.println(s+" "+map.get(s));
        }
    }
}

输出结果

HashMap迭代输出
Key2 Value2
Key1 Value1
Key0 Value0
Key4 Value4
Key3 Value3

LinkedHashMap迭代输出
Key0 Value0
Key1 Value1
Key2 Value2
Key3 Value3
Key4 Value4


HashTable迭代输出
Key4 Value4
Key3 Value3
Key2 Value2
Key1 Value1
Key0 Value0

TreeMap迭代输出 //TreeMap插入时会对Key进行排序
Key0 Value0
Key1 Value1
Key2 Value2
Key3 Value3
Key4 Value4

三、Map迭代输出的方法

主要有两种方法,我们可以看一下JDK1.8API 的方法描述

//方法一:返回一个Map.Entry的Set集合,这种方式就可以使用Entry输出
Set<Map.Entry<K,V>> entrySet()

//方法二:返回一个关于Key的set集合,我们可以通过Key向
Set<K> keySet()
    @Test
    public void TestMap(){
        Map<String,String> map = new HashMap<String,String>();
        for(int i = 0 ;i < 5;i++){
            map.put("Key"+i,"Value"+i);
        }
        System.out.println("通过KeySet的方式输出");
        Set<String> keySet = map.keySet();
        for(String s:keySet){
            System.out.println(s + "-"+map.get(s));
        }
        System.out.println("--------------------");
        System.out.println("通过Set<Map.Entry>来输出");
        Set<Map.Entry<String,String>> set = map.entrySet();
        for(Map.Entry entry:set){
            System.out.println(entry.getKey()+"-"+entry.getKey());
        }
    }

输出结果

通过KeySet的方式输出
Key2-Value2
Key1-Value1
Key0-Value0
Key4-Value4
Key3-Value3
--------------------
通过Set<Map.Entry>来输出
Key2-Key2
Key1-Key1
Key0-Key0
Key4-Key4
Key3-Key3

参考

https://zhuanlan.zhihu.com/p/21673805

猜你喜欢

转载自blog.csdn.net/makeliwei1/article/details/81564986