JAVA中MAP的四种类型区别和常见的简单用法_王世春的博客-程序员秘密

技术标签: HashTable  HashMap  编程  TreeMap  LinkedHashMap  

package com.springtest.map;

import org.junit.Test;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * HashMapA
 * HashMap是一个最常用的Map,它根据键的hashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。
 * HashMap最多只允许一条记录的键为null,不允许多条记录的值为nullHashMap不支持线程的同步,
 * 即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致。如果需要同步,
 * 可以用Collections.synchronizedMap(HashMapA map)方法使HashMap具有同步的能力。
 * Created by Joker on 2017/8/24.
 */
public class HashMapA {

    private Map<String, String> map = new java.util.HashMap<>();

    @Test
    public void test() throws InterruptedException {
        //HashMap多线程,线程不安全,此处使用Collections.synchronizedMap使HashMap具有同步能力
        Collections.synchronizedMap(map);
        ExecutorService executorService = Executors.newCachedThreadPool();
        executorService.submit(() -> map.put(null, null));
        executorService.submit(() -> map.put("1", "A"));
        executorService.submit(() -> map.put("2", "B"));
        Thread.sleep(1000);
        for (Map.Entry<String, String> key : map.entrySet()) {
            System.out.println(String.format("[key]=%s\t[value]=%s", key.getKey(), key.getValue()));
        }
    }


}



package com.springtest.map;

import org.junit.Test;

import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * HashTableA
 * HashtableHashMap类似,不同的是:它不允许记录的键或者值为空;它支持线程的同步,
 * 即任一时刻只有一个线程能写Hashtable,然而,这也导致了Hashtable在写入时会比较慢
 * Created by Joker on 2017/8/24.
 */
public class HashTableA {

    @Test
    public void test() throws InterruptedException {

        //Hashtable本身就是同步机制,所以比较慢
        Map<String, Object> map = new Hashtable<>();
        ExecutorService executorService = Executors.newCachedThreadPool();
        //executorService.execute(() -> map.put(null, null));
        executorService.execute(() -> map.put("1", "A"));
        executorService.execute(() -> map.put("2", "B"));
        Thread.sleep(1000);
        Iterator<Map.Entry<String, Object>> it = map.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry<String, Object> keyValue = it.next();
            System.out.println(String.format("[key]=%s\t[value]=%s", keyValue.getKey(), keyValue.getValue()));
        }

    }

}

package com.springtest.map;

import org.junit.Test;

import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * LinkedHashMapA
 * LinkedHashMap保存了记录的插入顺序,在用Iteraor遍历LinkedHashMap时,
 * 先得到的记录肯定是先插入的。在遍历的时候会比HashMap慢。有HashMap的全部特性。
 * Created by Joker on 2017/8/24.
 */
public class LinkedHashMapA {

    @Test
    public void test() throws InterruptedException {

        //多线程,线程不安全
        Map<String, Object> map = new LinkedHashMap<>();
        ExecutorService executorService = Executors.newCachedThreadPool();
        executorService.execute(() -> {
            map.put(null, null);
            map.put("1", "A");
            map.put("2", "B");
            map.put("3", "C");
            map.put("4", "D");
            map.put("5", "E");
        });
        Thread.sleep(1000);
        Iterator<Map.Entry<String, Object>> it = map.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry<String, Object> keyValue = it.next();
            System.out.println(String.format("[key]=%s\t[value]=%s", keyValue.getKey(), keyValue.getValue()));
        }

    }

}

package com.springtest.map;

import org.junit.Test;

import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * TreeMapA
 * TreeMap能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器。
 * 当用Iteraor遍历TreeMap时,得到的记录是排过序的。TreeMap的键和值都不能为空。
 * TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。
 * Created by Joker on 2017/8/24.
 */
public class TreeMapA {

    @Test
    public void test() throws InterruptedException {
        //多线程,线程不安全
        Map<String, Object> map = new TreeMap<>();
        ExecutorService executorService = Executors.newCachedThreadPool();
        executorService.execute(() -> {
            //map.put(null, null);
            map.put("4", "D");
            map.put("2", "B");
            map.put("3", "C");
            map.put("5", "E");
            map.put("1", "A");
        });
        Thread.sleep(1000);
        Iterator<Map.Entry<String, Object>> it = map.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry<String, Object> keyValue = it.next();
            System.out.println(String.format("[key]=%s\t[value]=%s", keyValue.getKey(), keyValue.getValue()));
        }
    }

}


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/goodsave/article/details/77527071

智能推荐

vue-axios post方式传参后台接收不到_vue对象controller接收不到奥_Yang950831的博客-程序员秘密

之前写了下vue-resource post传参现在写下vue-axios post方式后台Controller接收不到参数的解决方法:前台:&lt;!-- axios --&gt;&lt;script src="https://unpkg.com/axios/dist/axios.min.js"&gt;&lt;/script&gt;&lt;!-- qs--&gt;&lt;s...

Python中模块 & 文件夹与包 & 循环导入_Howdu的博客-程序员秘密

1、简单定义理解: 在Python中,模块是代码组织的一种方式,把功能相近的函数放到一个文件中,一个文件(.py)就是一个模块(module)。模块名就是文件名去掉后缀py。好处 :提高代码的可复用、可维护。一个模块编写完成后,可以更方便的在其他项目中导入。解决了命名冲突,不同模块中相同的命名不会冲突。2、自定义模块import 模块名 #调用 模块名.变量 、模块名.函...

目标检测新突破!了解Res2Net深度多尺度目标检测架构_qq_28168421的博客-程序员秘密

首 发 | AI开发者原标题 |Res2Net: New deep learning multi-scale architecture, for improved object d...

Ubuntu如何获得管理员权限_ubuntu管理员权限_lumos97的博客-程序员秘密

OS:Ubuntu 18.04.1打开Terminal;输入命令:sudo su;屏幕上会回显要求输入当前用户密码的提示,输入密码即可获得管理员权限;若想退出管理员权限可输入命令:su 用户名$ 是普通权限, #是管理员权限。...

11个有用的移动网页开发App和HTML5框架_JackieWell的博客-程序员秘密

在过去的两年里,触屏设备飞速增长。iOS和Android设备让开发者和设计师开始重新思考他们的网页应用,以提供更好的触屏体验。移动Web应用相对于本地的App有很多优势,虽然也有很多设计和开发上的挑战。这里列出了一系列有用的框架来帮助基于HTML的webapp开发。他们支持大部分流行的智能手机和平板。1.Lungo.js:HTML5移动开发框架Lungo.j

郑州远程教育的计算机和英语统考,郑州大学网络远程教育统考大学英语B6练习题..._Lunarnai的博客-程序员秘密

郑州大学网络远程教育统考大学英语B6练习题!一、交际英语1、- I think he is a good lecturer.- _________A:Sorry, it doesn't matter.B:So do I.C:Yes. It's a good idea.D:I don't mind.答案: B2、--I was worried about my maths, but Mr. Brow...

随便推点

深度学习实体关系抽取研究综述笔记_实体关系抽取的重要性_涂兆诚的博客-程序员秘密

鄂海红,张文静,肖思琪,程瑞,胡莺夕,周筱松,牛佩晴.深度学习实体关系抽取研究综述.软件学报,2019,30(6): 1793−1818. http://www.jos.org.cn/1000-9825/5817.htm摘要部分1、实体关系抽取很重要,是很多领域的核心任务和重要环节2、作用:能够从文本中抽取实体对间的语义关系3、发展趋势:深度学习的实体关系抽取技术,在特征提取的深度和模型的精确度上已经逐渐超过了传统基于特征和核函数的方法4、如何工作:通过对文本信息建模,自动抽取出实体对之间的语义关

数字IC设计思想之“乒乓操作”的总结与思考_weixin_30724853的博客-程序员秘密

图表 1“ 乒乓操作 ” 是一个常常应用于数据流控制的处理技巧,典型的乒乓操作方法如图 1 所示。乒乓操作的处理流程为:输入数据流通过 “ 输入数据选择单元 ” 将数据流等时分配到两个数据缓冲区,数据缓冲模块可以为任何存储模块,比较常用的存储单元为双口 RAM(DPRAM) 、单口 RAM(SPRAM) 、 FIFO 等。在第一个缓冲周期,将输入的数据流缓存到 “ 数据缓冲模块 ...

SAS t检验_sas t检验程序_Tiaaaaa的博客-程序员秘密

/*----------------- 一.单样本t检验 -----------------*//*有原始数据的t检验*/DATA TEMP; INPUT [email protected]@; Y=X-20.7; CARDS; 20.99 20.41 20.10 20.00 20.91 22.60 20.99 20.42 20.90 22.99 23.12 20.89 ;TITLE 'T检

移动侦测/周界入侵检测智能分析摄像头采集的智能分析数据如何通过国标GB28181平台进行接入与分发_区域入侵告警 国标可以传吗_EasyGBS的博客-程序员秘密

一、背景分析智能分析摄像机是基于深度学习处理平台的智能行为分析产品,支持多目标人脸检测、物体分析识别、行人及动作分析、交通工具检测及车辆信息分析等功能。集中部署情况下,通过多设备联动实现区域范围内无死角监控分析。而在实际监控过程中,智能分析摄像头必须配合后台二次分析服务器,实现监控区域人脸轨迹分析、行人体态特征分析识别的双重特征分析能力,弥补了传统人脸识别摄像机功能单一,应对场景单一问题,并可有效规避传统监管模式下行人躲避监控、隐蔽作案情况。但这种情况下,普通的监控摄像头还需要进行实时的视频

python的前端和后端_python是前端还是后端_weixin_39970668的博客-程序员秘密

Python属于后端开发,Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。在后端开发中有着极其重要的作用。【推荐教程:Python视频教程】Python 特点:1.易于学习:Python有相对较少的关键字,结构简单,和一个明确定义的语法,学习...

BloomFilter应用与D-Lelft BloomFilter实现_付伟736349065的博客-程序员秘密

此篇文章是开发过程中对BloomFilter应用场景的一些介绍,另外项目中实现了D-Left BloomFilter,相关实现时一些注意的地方,简单介绍下!首先看一些应用场景:1.海量的黑白名单。2.爬虫抓取时重复的URL处理。3.数据key是否存在检测4.(一些面试题几十亿不重复整数中判断其中一个整数是否存在的问题,BitMap/BloomFilter能很好的解决)。。。

推荐文章

热门文章

相关标签