早在jdk的1.1版本中,所有的集合都是线程安全的。但是在1.2以及之后的版本中就出现了一些线程不安全的集合,为什么版本升级会出现一些线程不安全的集合呢?因为线程不安全的集合普遍比线程安全的集合效率高的多。随着业务的发展,特别是在web应用中,为了提高用户体验减少用户的等待时间,页面响应速度(也就是效率)是优先考虑的。而且对线程不安全的集合加锁以后也能达到安全的效果(但是效率会低,因为会有锁的获取以及等待)。其实在jdk源码中相同效果的集合线程安全的比线程不安全的就多了一个同步机制,但是效率上却低了不止一点点,因为效率低,所以已经不太建议使用了。下面举一些常用的功能相同却线程安全和不安全的集合。

Vector:就比Arraylist多了个同步化机制(线程安全)。

Hashtable:就比Hashmap多了个线程安全。

ConcurrentHashMap:是一种高效但是线程安全的集合。

Stack:栈,也是线程安全的,继承于Vector。

LinkedHashMap是继承于HashMap,是基于HashMap和双向链表来实现的。

HashMap无序;LinkedHashMap有序,可分为插入顺序和访问顺序两种。如果是访问顺序,那put和get操作已存在的Entry时,都会把Entry移动到双向链表的表尾(其实是先删除再插入)。

LinkedHashMap存取数据,还是跟HashMap一样使用的Entry[]的方式,双向链表只是为了保证顺序。

LinkedHashMap是线程不安全的。

HashSet与HashMap的区别

面试中经常被问到HashMap与HashSet的区别。于是本渣静下心来总结了一下HashSet与HashMap的区别。

  先了解一下HashMap跟HashSet

HashSet:

  HashSet实现了Set接口,它不允许集合中出现重复元素。当我们提到HashSet时,第一件事就是在将对象存储在

HashSet之前,要确保重写hashCode()方法和equals()方法,这样才能比较对象的值是否相等,确保集合中没有

储存相同的对象。如果不重写上述两个方法,那么将使用下面方法默认实现:

 public boolean add(Object obj)方法用在Set添加元素时,如果元素值重复时返回 "false",如果添加成功则返回"true"

HashMap:

  HashMap实现了Map接口,Map接口对键值对进行映射。Map中不允许出现重复的键(Key)。Map接口有两个基本的实现

TreeMap和HashMap。TreeMap保存了对象的排列次序,而HashMap不能。HashMap可以有空的键值对(Key(null)-Value(null))

HashMap是非线程安全的(非Synchronize),要想实现线程安全,那么需要调用collections类的静态方法synchronizeMap()实现。

public Object put(Object Key,Object value)方法用来将元素添加到map中。

HashSet与HashMap的区别:

先说说HashSet是啥?

顾名思义,首先它是Set,既然是Set,它保障其中元素都是唯一的。

其次它是HashSet,所以它是一个空间换时间的玩意,占地面积大,存取速度快。

它不像Map那样是K,V的键值对,它只有一个V。一般常用的操作为放入元素,检查是否存在元素,遍历整个Set,遍历有个缺点,它是无序的,如果要求遍历有序时可以换用LinkedHashSet

这样一来场景就明显了,需要使用集合保存一组对象时,如果要求对象不重复,并且对存取的速度快的场景,就可以使用HashSet。

实际场景的应用我一时半会还真想不出来,比较多用到Set的地方是拿HashMap的keys。

还是举个假栗子吧, 如果我们有十万条消费记录,想数出来是多少人的,只要把人的ID往Set里面装,消费记录遍历完成之后,看一下Set的尺寸就可以。

java 集合及其线程安全 及其 set linkedList map table 区别的更多相关文章

  1. Java 集合系列08之 List总结(LinkedList, ArrayList等使用场景和性能分析)

    概要 前面,我们学完了List的全部内容(ArrayList, LinkedList, Vector, Stack). Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例 Ja ...

  2. 【转】Java 集合系列08之 List总结(LinkedList, ArrayList等使用场景和性能分析)

    概要 前面,我们学完了List的全部内容(ArrayList, LinkedList, Vector, Stack). Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例 Ja ...

  3. Java集合系列(二):ArrayList、LinkedList、Vector的使用方法及区别

    本篇博客主要讲解List接口的三个实现类ArrayList.LinkedList.Vector的使用方法以及三者之间的区别. 1. ArrayList使用 ArrayList是List接口最常用的实现 ...

  4. java——集合、泛型、ArrayList、LinkedList、foreach循环、模拟ktv点歌系统

    集合:一系列特殊的类,这些类可以存储任意类型的对象,长度可变,集合类都在java.util包中. 但是集合记不住对象的类型,当把对象从集合中取出时这个对象的编译类型就变成了Object类型.这样在取元 ...

  5. Java集合框架:Set、List、Map等介绍

    目录 1.Java集合类基本概念 2.Java集合类架构层次关系 1.Java集合类基本概念 在编程中,常常需要集中存放多个数据.从传统意义上来讲,数组是我们一个很好的选择,前提是我们事先已经明确知道 ...

  6. java集合介绍(List,Set,Map)

    前言 介绍java的常用集合+各个集合使用用例 欢迎转载,请注明作者和出处哦☺ 参考: 1,<Java核心编程技术(第二版)> 2, http://www.cnblogs.com/Litt ...

  7. Java 集合深入理解(14):Map 概述

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 终于把 List 常用的几种容器介绍完了,接下来开始 Map 的相关介绍. 什么是 Map Java 中的 Map 接口 ...

  8. 初识Java集合框架(Iterator、Collection、Map)

    1. Java集合框架提供了一套性能优良.使用方便的接口和类,它们位于java.util包中 注意: 既有接口也有类,图中画实线的是类,画虚线的是接口 使用之前须要到导入java.util包 List ...

  9. 08 Java 集合的线程安全问题

    1 Java中的集合 Java中的集合分为同步的集合(线程安全)和线程不安全的集合 例如 : ArrayList和Vector的区别: 一.同步性:Vector是线程安全的,也就是说是同步的,而Arr ...

随机推荐

  1. JwtAccessTokenConverter问题整理

    Cannot convert access token to JSON 授权服务颁发token(未进行公私钥加密)后,携带此token请求资源服务,提示此错误. 使用token可以在线解析,跟踪代码后 ...

  2. MongoDB 带访问控制的副本集部署

    当你需要用到一个MongoDB 副本集集群,用于开发测试时, 可以通过下面的步骤简单完成. 版本及环境 MongoDB4.4  Centos6.5  一. 下载安装 MongoDB Server 及 ...

  3. 商业智能BI必备的特性

    商业智能BI的本质对企业来说,商业智能BI不能直接产生决策,而是利用BI工具处理后的数据来支持决策.核心是通过构建数据仓库平台,有效整合数据.组织数据,为分析决策提供支持并实现其价值. 传统的DW/O ...

  4. Visual Studio 的快捷不能用时候,我们只要选择重置就可以用了。

    当发现Visual Studio 的快捷不能用时候,我们只要选择重置就可以用了.

  5. Activity的创建及生命周期

  6. Chrome:插件安装

    1.首先要下载一油猴插件管理器 得到crx文件 2.打开'扩展程序',在Chrome右上角 3.启动开发者模式(右上角),然后将油猴crx文件拖入界面中,会自动安装油猴 安装完成后,在工具栏中会出现油 ...

  7. Python:Scrapy(二) 实例分析与总结、写一个爬虫的一般步骤

    学习自:Scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250 - 知乎 Python Scrapy 爬虫框架实例(一) - Blue·Sky - 博客园 1.声明Item 爬虫爬取的目标是从非 ...

  8. k8s-ingress部署测试以及深入理解

    1.ingress 部署有两种方式.本次采用DaemonSet部署. apiVersion: v1 kind: Namespace metadata: name: ingress-nginx --- ...

  9. python实用脚本-定时导出数据库中的数据并且发送数据到邮箱

    1.发送邮件脚本 #coding=utf-8 import smtplib from email.header import Header from email.mime.text import MI ...

  10. (第二章第一部分)TensorFlow框架之文件读取流程

    本章概述:在第一章的系列文章中介绍了tf框架的基本用法,从本章开始,介绍与tf框架相关的数据读取和写入的方法,并会在最后,用基础的神经网络,实现经典的Mnist手写数字识别. 有四种获取数据到Tens ...