zoukankan      html  css  js  c++  java
  • JAVA集合框架(三)-Map

    前言

    Map是java中用于存储键值对映射的接口。是解决编程问题最常用的数据结构之一。
    在工作中,有时候为实现一个功能可能写了好大一段代码,运行是ok了,但是就是不想回头再看,不敢相信自己写的这么烂。这个时候其实可以多考虑下map这种结构了,说不定能更简洁地实现呢。
    引用《编程思想》中一个代码示例:
    测试Random可以产生理想的数字分布。其实就是统计一个产生随机数的次数。

    public class RandomTest {
    	@Test
    	public void testRandom() 
    	{
    		Random rand =new Random(47);
    		Map<Integer,Integer> map = new HashMap<Integer, Integer>();
    		for(int i = 1; i < 10000; i++) 
    		{
    			int r = rand.nextInt(20);
    			Integer freq = map.get(r);
    			map.put(r, freq == null ? 1 : freq + 1);
    		}
    		System.out.println(map);
    	}
    }
    

    输出结果:
    {0=481, 1=502, 2=488, 3=508, 4=481, 5=503, 6=519, 7=471, 8=468, 9=549, 10=513, 11=531, 12=521, 13=506, 14=477, 15=497, 16=533, 17=509, 18=478, 19=464}

    Map接口的常用实现类

    • HashMap
    • LinkedHashMap
    • TreeMap
    • ConurrentHashMap
    • Hashtable
    • WeakHashMap

    一般来说,HashMap是你的第一选择,因为它对速度进行了优化。如果有其他比如排序或是线程安全方面的需求时,才考虑选择其他的实现。

    HashMap特性告白
    基于散列表实现,存储key的顺序不是插入的顺序。可以通过构造器设置容量和负载因子,以调整容器性能。
    遍历HashMap的几种方法:

    	// for循环entryset
    	for(Entry<Integer,Integer>entry : map.entrySet()) 
    	{
    		System.out.println("key:" + entry.getKey() + ",value:" + entry.getValue());
    	}
    		
    	// 遍历key获取values
            for (Integer key : map.keySet()) 
            {
                System.out.println(key + "===" + map.get(key));
            }
            
            // 遍历values
            for (Integer value : map.values()) {
                System.out.println("value:" + value);
            }
    		
    

    LinkedHashMap 特性告白
    类似于HashMap,通过链表来维护插入key的顺序,保证放入和取出的顺序是一致的。
    如果使用场景中既要求映射关系、又要保证存储顺序,可以选择此种实现类。
    性能上较HashMap慢一点。迭代访问时能快点,因为链表的缘故。

    TreeMap 特性告白
    基于红黑树实现。查看“键”或“键值对”时,它们会被排序(次序是由Comparable或Comparator决定)。

    • 要么存储进入TreeMap的对象时实现了Comparable接口的可比较对象
    • 要么在创建TreeMap容器时需要传入比较器对象Comparator

    ConurrentHashMap 特性告白
    java.util.concurrent包中的线程安全的映射容器。
    主要为了解决HashMap线程不安全和Hashtable效率不高的问题。

    Hashtable 特性告白
    是Hashtable,而不是HashTable呦!
    基本和HashMap很类似,只是Hashtable的方法加了synchronized重量级锁来保证线程安全性。

    WeakHashMap 特性告白
    “弱键”映射,允许释放映射所指向的对象;主要是为解决某类特殊问题而设计的。如果映射之外没有引用指向某个“键”,则此“键”可以被垃圾收集器回收。(还没用过,先晓得有这种“高级容器”吧)

    总结

    本编主要从编码使用层面总结了常用map映射集合的实现类及其各自特性。

    关注蚂蚁君,不放过每一次学习的机会。

  • 相关阅读:
    Java Web学习总结(16)——JSP的九个内置对象
    Java Web学习总结(15)——JSP指令
    【我的物联网成长记11】8招带你玩转规则引擎
    云图说|高效管理华为云SAP的“秘密武器”
    Python 中更优雅的日志记录方案
    有了它,Python编码再也不为字符集问题而发愁了!
    【鲲鹏来了】手把手教你创造一个属于自己的鲲鹏开发者环境
    解密昇腾AI处理器--DaVinci架构(计算单元)
    使用Keil5构建GD32450i-EVAL工程
    云图说|SAP技术画册“一点通”
  • 原文地址:https://www.cnblogs.com/happyone/p/11068618.html
Copyright © 2011-2022 走看看