0.Java中的集合框架

1.Map--接口

public interface Map<K,V>

包:java.util.Map

Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value;

Map中的键值对以Entry类型的对象实例形式存在;

键(key值)不可重复,value值可以重复,一个value值可以和很多key值形成对应关系,每个建最多只能映射到一个值。

Map支持泛型,形式如:Map<K,V>

Map中使用put(K key,V value)方法添加

给定一个键和一个值,你可以将该值存储在一个Map对象. 之后,你可以通过键来访问对应的值。

当访问的值不存在的时候,方法就会抛出一个NoSuchElementException异常.

当对象的类型和Map里元素类型不兼容的时候,就会抛出一个 ClassCastException异常。

当在不允许使用Null对象的Map中使用Null对象,会抛出一个NullPointerException 异常。

当尝试修改一个只读的Map时,会抛出一个UnsupportedOperationException异常。

2.HashMap--实现类

public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable

包:java.util.HashMap

HashMap是Map的一个重要实现类,也是最常用的,基于哈希表实现

HashMap中的Entry对象是无序排列的

Key值和value值都可以为null,但是一个HashMap只能有一个key值为null的映射(key值不可重复)

3.Hashtable--实现类

public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable

HashTable 是以数组和单向链表结合的存储形式;

存储元素时,key通过hash映射函数得到在HashTable存储数组中的位置;

该位置存放的是hash值一致的单向链表的首元素;

新的元素存储到该位置指向的列表中;

数组存储哈希后的key,哈希值相同,则使用链表解决哈希碰撞,放到链表中。

Hashtable是遗留类,很多映射的常用功能与HashMap类似,不同的是它承自Dictionary类,并且是线程安全的,

任一时间只有一个线程能写Hashtable,并发性不如ConcurrentHashMap,因为ConcurrentHashMap引入了分段锁。

Hashtable不建议在新代码中使用,不需要线程安全的场合可以用HashMap替换,需要线程安全的场合可以用ConcurrentHashMap替换。

4.ConcurrentHashMap---实现类

public class ConcurrentHashMap<K,V> extends AbstractMap<K,V>
implements ConcurrentMap<K,V>, Serializable

包:java.util.concurrent.ConcurrentHashMap

ConcurrentHashMap允许并发的读和线程安全的更新操作

在执行写操作时,ConcurrentHashMap只锁住部分的Map

并发的更新是通过内部根据并发级别将Map分割成小部分实现的

高的并发级别会造成时间和空间的浪费,低的并发级别在写线程多时会引起线程间的竞争

ConcurrentHashMap的所有操作都是线程安全

ConcurrentHashMap返回的迭代器是弱一致性,fail-safe并且不会抛出ConcurrentModificationException异常

ConcurrentHashMap不允许null的键值

可以使用ConcurrentHashMap代替HashTable,但要记住ConcurrentHashMap不会锁住整个Map

5.HashMap与Hashtable

HashTable和HashMap采用相同的存储机制,二者的实现基本一致,不同的是:

1、HashMap是非线程安全的,HashTable是线程安全的,内部的方法基本都是synchronized。

2、HashTable不允许有null值的存在。

3、因为线程安全的问题,HashMap效率比HashTable的要高。

在HashTable中调用put方法时,如果key为null,直接抛出NullPointerException。其它细微的差别还有,比如初始化Entry数组的大小等等,但基本思想和HashMap一样。

6.HashTable和ConcurrentHashMap

ConcurrentHashMap是线程安全的HashMap的实现。

同样是线程安全的类,它与HashTable在同步方面有什么不同呢?

之前我们说,synchronized关键字加锁的原理,其实是对对象加锁,不论你是在方法前加synchronized还是语句块前加,锁住的都是对象整体,

但是ConcurrentHashMap的同步机制和这个不同,它不是加synchronized关键字,而是基于lock操作的,

这样的目的是保证同步的时候,锁住的不是整个对象。

事实上,ConcurrentHashMap可以满足concurrentLevel个线程并发无阻塞的操作集合对象。

ConcurrentHashMap基于concurrentLevel划分出了多个Segment来对key-value进行存储,从而避免每次锁定整个数组,在默认的情况下,允许16个线程并发无阻塞的操作集合对象,尽可能地减少并发时的阻塞现象。

在多线程的环境中,相对于HashTable,ConcurrentHashMap会带来很大的性能提升!

部分内容参考:http://www.cnblogs.com/wang-meng/p/5808006.html

Java 基础:Map的一家的更多相关文章

  1. java基础-Map集合

    java基础-Map集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Map集合概述 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它 ...

  2. Java 基础 Map 练习题

    第一题 (Map)利用Map,完成下面的功能: 从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队.如果该 年没有举办世界杯,则输出:没有举办世界杯. 附:世界杯冠军以及对应的夺冠年 ...

  3. java基础-Map的静态初始化以及Map的遍历等.....................

    1.map的静态初始化,以及map遍历的几种方法: package com.cy.test; import java.util.HashMap; import java.util.Iterator; ...

  4. UVA 814 The Letter Carrier's Rounds(JAVA基础map)

    题解:就是按照题目模拟就好 但是这个题目让我发现了我Java里面许多问题 具体看代码,但是还是分为这几个方面 属性的作用域问题,缓冲区问题,map与list映射的问题,输出多个空格不一定是/t,反转思 ...

  5. java基础-Map

    简介 Map是一种接口,实现类有 hashMap SortedMap是继承自Map的接口,实现类为TreeMap,在内部会对Key进行排序 遍历Map 使用for each循环遍历Map实例的keyS ...

  6. java基础——Map集合

    Map以键值对的形式存储数据,其中Map.entry,是Map的内部类,它用来描述Map中的键值对.Map是一个接口,HashMap是他的一个实现类 Map中有几个重要的方法: get(Object ...

  7. Java基础 - Map接口的实现类 : HashedMap / LinkedHashMap /TreeMap 的构造/修改/遍历/ 集合视图方法/双向迭代输出

    Map笔记: import java.util.*; /**一:Collection接口的 * Map接口: HashMap(主要实现类) : HashedMap / LinkedHashMap /T ...

  8. Java基础Map接口+Collections工具类

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  9. Java基础Map接口+Collections

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

随机推荐

  1. 普通element ui table组件的使用

    1.使用基础的element ui 的table的基础使用 首先,使用前要先引用element库到项目中,可以直接引入element的js和css或者在vue项目下按需加载不同的组件 废话不多说,直接 ...

  2. springboot笔记06——使用Thymeleaf模板引擎

    前言 Springboot 推荐使用Thymeleaf做视图层.Thymeleaf支持 html 原型,然后在 html 标签里增加额外的属性来达到模板+数据的展示方式.浏览器解释 html 时会忽略 ...

  3. sqlite 一些常用的句子

    有关SQLITE最完整的操作语句参考资料,应当是官方网址的http://www.sqlite.org/lang.html这个地方. select max(id)  from table  取最大id ...

  4. Java中BIO和NIO

    同步/异步.阻塞/非阻塞概念 同步异步 同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication) 同步:在发出一个 ...

  5. Javap与JVM指令

    一.javap命令简述 javap是jdk自带的反解析工具.它的作用就是根据class字节码文件,反解析出当前类对应的code区(汇编指令).本地变量表.异常表和代码行偏移量映射表.常量池等等信息.当 ...

  6. Fortify漏洞之Portability Flaw: Locale Dependent Comparison

    继续对Fortify的漏洞进行总结,本篇主要针对 Portability Flaw: Locale Dependent Comparison 漏洞进行总结,如下: 1.Portability Flaw ...

  7. springboot学习入门简易版六---springboot2.0整合全局捕获异常及log4j日志(12-13)

    使用Aop实现 1创建异常请求 在原有项目基础上,jspController中创建一个可能发生异常的请求: /** * 全局捕获异常测试 * @param i * @return */ @Reques ...

  8. elasticsearch 7版本 基础操作

    elasticsearch 7版本 基础操作 首先我们浏览器http://localhost:5601/进入 kibana里的Console中输入 首先让我们在 Console 中输入: PUT t1 ...

  9. Android笔记(五十六) Android四大组件之一——ContentProvider,实现自己的ContentProvider

    有时候我们自己的程序也需要向外接提供数据,那么就需要我们自己实现ContentProvider. 自己实现ContentProvider的话需要新建一个类去继承ContentProvider,然后重写 ...

  10. 加标签的continue用法

    1.加标签的continue,类似于C语言的goto语句