声明:本文非原创;

在程序员开发过程中,Map有着利用率占比是非常高;很多时间我们只知其用,不知其理;写这个随笔的目的也是希望对伙伴们对Map的理解有一点帮助。

类型介绍

java自带各种Map类。统一可分为三个类型:

1通用Map,用于在应用程序中管理映射,通常在java,util包中实现

HashMap,HashTable,properties,LinkedHashMap,IdentityHashMap,treeMap,weakHashMap,ConcurrentHashMap

2专用Map,通常我们不必建此类Map,而是通过某些其他类进行访问

java.util.jar.Attributes、javax.print.attribute.standard.PrinterStateReasons、java.security.Provider、java.awt.RenderingHints、javax.swing.UIDefaults;

3. 一个用于帮助我们实现自己的Map类的抽象类

AbstractMap

类型区别

HashMap

最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为Null(多条会覆盖);允许多条记录的值为 Null。非同步的。

TreeMap

能够把它保存的记录根据键(key)排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。TreeMap不允许key的值为null。非同步的。 
Hashtable

与 HashMap类似,不同的是:key和value的值均不允许为null;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢。 
LinkedHashMap

保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.在遍历的时候会比HashMap慢。key和value均允许为空,非同步的。

四种常用Map插入与读取性能比较

 

public class Test {

    static int hashMapW = 0;

    static int hashMapR = 0;

    static int linkMapW = 0;

    static int linkMapR = 0;

    static int treeMapW = 0;

    static int treeMapR = 0;

    static int hashTableW = 0;

    static int hashTableR = 0;

    public static void main(String[] args) {

        for (int i = 0; i < 10; i++) {

            Test test = new Test();

            test.test(100 * 10000);

            System.out.println();

        }

        System.out.println("hashMapW = " + hashMapW / 10);

        System.out.println("hashMapR = " + hashMapR / 10);

        System.out.println("linkMapW = " + linkMapW / 10);

        System.out.println("linkMapR = " + linkMapR / 10);

        System.out.println("treeMapW = " + treeMapW / 10);

        System.out.println("treeMapR = " + treeMapR / 10);

        System.out.println("hashTableW = " + hashTableW / 10);

        System.out.println("hashTableR = " + hashTableR / 10);

    }

    public void test(int size) {

        int index;

        Random random = new Random();

        String[] key = new String[size];

        // HashMap 插入

        Map<String, String> map = new HashMap<String, String>();

        long start = System.currentTimeMillis();

        for (int i = 0; i < size; i++) {

            key[i] = UUID.randomUUID().toString();

            map.put(key[i], UUID.randomUUID().toString());

        }

        long end = System.currentTimeMillis();

        hashMapW += (end - start);

        System.out.println("HashMap插入耗时 = " + (end - start) + " ms");

        // HashMap 读取

        start = System.currentTimeMillis();

        for (int i = 0; i < size; i++) {

            index = random.nextInt(size);

            map.get(key[index]);

        }

        end = System.currentTimeMillis();

        hashMapR += (end - start);

        System.out.println("HashMap读取耗时 = " + (end - start) + " ms");

        // LinkedHashMap 插入

        map = new LinkedHashMap<String, String>();

        start = System.currentTimeMillis();

        for (int i = 0; i < size; i++) {

            key[i] = UUID.randomUUID().toString();

            map.put(key[i], UUID.randomUUID().toString());

        }

        end = System.currentTimeMillis();

        linkMapW += (end - start);

        System.out.println("LinkedHashMap插入耗时 = " + (end - start) + " ms");

        // LinkedHashMap 读取

        start = System.currentTimeMillis();

        for (int i = 0; i < size; i++) {

            index = random.nextInt(size);

            map.get(key[index]);

        }

        end = System.currentTimeMillis();

        linkMapR += (end - start);

        System.out.println("LinkedHashMap读取耗时 = " + (end - start) + " ms");

        // TreeMap 插入

        key = new String[size];

        map = new TreeMap<String, String>();

        start = System.currentTimeMillis();

        for (int i = 0; i < size; i++) {

            key[i] = UUID.randomUUID().toString();

            map.put(key[i], UUID.randomUUID().toString());

        }

        end = System.currentTimeMillis();

        treeMapW += (end - start);

        System.out.println("TreeMap插入耗时 = " + (end - start) + " ms");

        // TreeMap 读取

        start = System.currentTimeMillis();

        for (int i = 0; i < size; i++) {

            index = random.nextInt(size);

            map.get(key[index]);

        }

        end = System.currentTimeMillis();

        treeMapR += (end - start);

        System.out.println("TreeMap读取耗时 = " + (end - start) + " ms");

        // Hashtable 插入

        key = new String[size];

        map = new Hashtable<String, String>();

        start = System.currentTimeMillis();

        for (int i = 0; i < size; i++) {

            key[i] = UUID.randomUUID().toString();

            map.put(key[i], UUID.randomUUID().toString());

        }

        end = System.currentTimeMillis();

        hashTableW += (end - start);

        System.out.println("Hashtable插入耗时 = " + (end - start) + " ms");

        // Hashtable 读取

        start = System.currentTimeMillis();

        for (int i = 0; i < size; i++) {

            index = random.nextInt(size);

            map.get(key[index]);

        }

        end = System.currentTimeMillis();

        hashTableR += (end - start);

        System.out.println("Hashtable读取耗时 = " + (end - start) + " ms");

    }

}

 

Map四种遍历

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map; public class TestMap {
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "a");
map.put(2, "b");
map.put(3, "ab");
map.put(4, "ab");
map.put(4, "ab");// 和上面相同 , 会自己筛选
System.out.println(map.size());
// 第一种:    System.out.println("第一种:通过map.keySet()for遍历key和value:");
for (Integer in : map.keySet()) { //map.keySet()返回的是所有key的值
System.out.println(“key=”+in + ";value=" + map.get(in););
}
// 第二种:
System.out.println("第二种:通过Map.entrySet使用iterator遍历key和value:");
Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<Integer, String> entry = it.next();
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
// 第三种:推荐,尤其是容量大时
System.out.println("第三种:通过Map.entrySet遍历key和value");
for (Map.Entry<Integer, String> entry : map.entrySet()) {
//1:几个方法:用上面的名字entry,entry.getKey() ,entry.getValue(),entry.setValue();
   //2:map.entrySet() 返回此映射中包含的映射关系的 Set视图
System.out.println("key= " + entry.getKey() + " value= " + entry.getValue());
}//
// 第四种:
System.out.println("第四种:通过Map.values()遍历所有的value,但不能遍历key");
for (String v : map.values()) {
System.out.println("value= " + v);
}
}
}

Map类型介绍与遍历的更多相关文章

  1. C++map类型 之 简单介绍

    一:map的前世今生 (1)从关联容器与顺序容器说起.关联容器通过键(key)存储和读取元素.而顺序容器则通过元素在容器中的位置顺序存储和訪问元素(vector,queue,stack,list等). ...

  2. Play Framework常用标签list,set,如何遍历list、map类型数据

    最近一段时间的项目都是在Play这个框架上进行开发的,挺强大的,但不足之处也挺多的.今天分享下play中强大的标签,遍历list,map类型的数据的用法. 遍历单纯的list数据,例如:List< ...

  3. map 类型

    map 是键-值对的集合.map 类型通常可理解为关联数组(associative array): 可使用键作为下标来获取一个值,正如内置数组类型一样.而关联的本质在于元素的值与某个特定的键相关联,而 ...

  4. Hibernate执行原生SQL返回List<Map>类型结果集

    我是学java出身的,web是我主要一块: 在做项目的时候最让人别扭的就是hibernate查询大都是查询出List<T>(T指代对应实体类)类型 如果这时候我用的联合查询,那么返回都就是 ...

  5. C++ Primer 有感(标准库map类型)

    map是键-值对的集合.map类型通常可以理解为关联数组:可以使用键作为下标获取一个值,正如内置数组一样.而关联的本质在于元素的值于某个特定的键相关联,而并非通过元素在数组中的位置获取. 1.map对 ...

  6. Go基础系列:map类型

    Go里的map用于存放key/value对,在其它地方常称为hash.dictionary.关联数组,这几种称呼都是对同一种数据结构的不同称呼,它们都用于将key经过hash函数处理,然后映射到val ...

  7. JavaScript中的Map、Set及其遍历

    Map Map是一组键值对的结构,具有极快的查找速度. Map的定义. //空map设值key-value var m = new Map(); m.set("XiaoMing", ...

  8. C++容器(四):map类型

    map 类型 map是键-值对的集合.map类型通常可以理解为关联数组:可以使用键作为下标来获取一个值,正如内置数组类型一样.而关联的本质在于元素的值与某个特定的键相关联,而非通过元素在数组内的位置来 ...

  9. 【原创】go语言学习(十)Map类型

    目录 声明和初始化 基本操作 map排序 map类型的切⽚片 课后作业 声明和初始化 1.map类型是⼀一个key-value的数据结构. //var a map[key的类型]value类型 var ...

随机推荐

  1. numpy.random模块常用函数解析

    numpy.random模块中常用函数解析 numpy.random模块官方文档 1. numpy.random.rand(d0, d1, ..., dn)Create an array of the ...

  2. Git安装使用指南

    Git安装使用指南 Git原理示意图 1. 安装git Linux服务器版本为Redhat6.2-64,其他版本可能有些许不同 1.1 安装依赖包 在安装git前首先安装依赖包,包括的依赖包有: cv ...

  3. Nginx配置 隐藏入口文件index.php

    Nginx配置文件里放入这段代码 server { location / { index index.php index.html index.htm l.php; autoindex on; if ...

  4. 【模板】51nod 1051 最大子矩阵和

    [题解] 二重循环枚举起始列和终止列,竖着往下加,转化为一个最大子段和问题,逐行累加即可. #include<cstdio> #include<cstring> #includ ...

  5. 洛谷 2574 XOR的艺术

    [题解] 线段树维护区间中1的个数就好了.每次修改就打上标记并把区间的sum改为len-sum. #include<cstdio> #include<algorithm> #i ...

  6. Codeforces 938C - Constructing Tests

    传送门:http://codeforces.com/contest/938/problem/C 给定两个正整数n,m(m≤n),对于一个n阶0-1方阵,其任意m阶子方阵中至少有一个元素“0”,则可以求 ...

  7. Windows窗口创建的具体步骤

    /*实现窗口创建的六步骤:第一步:创建入口函数WinMain第二步:注册窗口类第三部:实现回调函数的功能第四步:显示窗口第五步:更新窗口第六步:消息循环*/ #include "stdafx ...

  8. java json数据转List对象的集合-----阿里巴巴插件---及原生json---JSON 与 对象 、集合 之间的转换 JSON字符串和java对象的互转【json-lib】

    List<RunfastFullLess> list=(List<RunfastFullLess>)JSONArray.parseObject(activity.getFull ...

  9. HDU 1542 Atlantics 线段树+离散化扫描

    将 x 轴上的点进行离散化,扫描线沿着 y 轴向上扫描 每次添加一条边不断找到当前状态有效边的长度 , 根据这个长度和下一条边形成的高度差得到一块合法的矩形的面积 #include<iostre ...

  10. noip模拟赛 铺瓷砖

    [问题描述]有一面很长很长的墙. 你需要在这面墙上贴上两行瓷砖. 你的手头有两种不同尺寸的瓷砖, 你希望用这两种瓷砖各贴一行.瓷砖的长可以用分数表示,贴在第一行的每块瓷砖长度为A/B贴在第二行的每块瓷 ...