文档章节

Map集合的初步探讨

v逍遥一生
 v逍遥一生
发布于 2015/01/19 15:47
字数 827
阅读 33
收藏 0

在java中,Map集合使用的频率是很高的,先看下Map集合的类结构。Map集合在存储的过程中不保证存储的顺序,同样不保证每次取出的顺序是一致的。

其中,经常会使用的实现类有HashMap和Hashtable。这两个实现类也经常会在面试的过程中被提及。下面通过JDK的源码来详细的分析一下这两个类的区别。

    在面试的过程中,面试官经常会问的一个问题就是:HashMap与Hashtable的区别。要想弄清他们两者的区别就需要去对两个类进行分析,首先来分析一下HashMap这个类。

一、HashMap详解

HashMap起始于JDK1.2版本,通常是用key-value来保存数据。从类名就能看出该类存储的过程中使用到了哈希值。先看一下该类的一些属性。

    static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // 这是HashMap默认初始化的长度 16

    static final int MAXIMUM_CAPACITY = 1 << 30; //默认最大的存储长度

    

    static final float DEFAULT_LOAD_FACTOR = 0.75f; //默认负载因子,当存储的数量=负载因子*初始化长度时,HashMap中的数组将自动扩容

    static final Entry<?,?>[] EMPTY_TABLE = {}; //由此可以看出HashMap利用的是数组来存储数据

    transient Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE;

    transient int size;

  

    int threshold;

 

    final float loadFactor;

    transient int modCount;

    static final int ALTERNATIVE_HASHING_THRESHOLD_DEFAULT = Integer.MAX_VALUE;

通过以上的一些属性不难看出HashMap内部的存储结构。其实就是利用数组来存储数据,如果数组的同一个位置存入了不同的数据,就会在该数组的位置上在利用链表来存储,所以内部的结构如下图所示:

通过以上的数据结构方式来实现HashMap。了解来HashMap的内部结构,下面来说一说它的存入数据的方式。

从上面的代码可以发现HashMap对于key-value值都能存入null值,不会出现异常。并且HashMap所有的方法都是异步操作,需要注意访问同一资源的时候会出现安全问题,但是也是因为这个原因,所以HashMap的方法执行的速度是比较快的。

二、Hashtable详解

与HashMap相比,Hashtable早了两个版本,起始于JDK1.0。由于Hashtable是线程安全的,所以它所有的方法都是synchronized修饰的。也正式因为这个原因,导致它执行的速度较慢,所有出现来后面的HashMap。同样来看下Hashtable的部分源码。

Hashtable就不能跟HashMap一样key-value存入null值,会抛NullPointerException错误。如果是value为null,会在上面方法的第三行抛出空指针异常,如果是key为null,会在执行hash(key)的时候抛出空指针异常。如果key已经存在,那么新的value会替代旧的value,这与HashMap是一致的。Hashtable如果内部数组的长度不够,则会执行rehash()方法增加哈希表的容量,重新重组该Hashtable。

综上所属,HashMap与Hashtable的区别有二点:

1、HashMap是非线程安全的,Hashtable是线程安全的。

2、HashMap的key和value都可以存null值,而Hashtable的key和value都不能存null值。

© 著作权归作者所有

共有 人打赏支持
v逍遥一生
粉丝 0
博文 2
码字总数 1266
作品 0
浦东
私信 提问
day18 java 语言中的Map集合

day18 java 语言中的Map集合 一、Map集合的概述: 学完了set集合与list集合以后,我们在学习Map集合,这个集合与前面的两种集合具有一定的区别,在存储值的方式就有区别了,他是以“键--->值...

孤独一夜
2017/10/22
0
0
Spark的Python编程-初步入门

原文地址:http://spark.apache.org/docs/latest/programming-guide.html Spark提供了Python脚本编程接口,这里简单介绍其使用。 相关链接:East 2015 (Nov 26, 2014) 、Archive 、Download ...

openthings
2016/03/02
176
0
【Java入门提高篇】Java集合类详解(一)

今天来看看Java里的一个大家伙,那就是集合。 集合嘛,就跟它的名字那样,是一群人多势众的家伙,如果你学过高数,没错,就跟里面说的集合是一个概念,就是一堆对象的集合体。集合就是用来存...

MFrank
2018/05/18
0
0
Spark Streaming源码解读之RDD生成全生命周期彻底研究和思考

思考:1、 RDD是怎么生成的,依靠什么生成 2、执行时是否与Spark Core上的RDD执行有什么不同的 3、 运行之后我们要怎么处理。为什么有第三点 : 是因为Spark Streaming 中会随着相关触发条件,...

荀道子
2016/05/29
108
0
EJB持久层cannot simultaneously fetch multiple bags异常的解决

病理特征:Caused by: org.hibernate.HibernateException: cannot simultaneously fetch multiple bags, 堆栈信息:org.springframework.beans.factory.BeanCreationException: Error crea......

曹_翔
2011/01/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【git工具】git bash

添加别名命令 git bash 下添加 alias: windows 工具:git bash 下添加 alias 配置文件 \Git\etc\bash.bashrc 即可,在gitbash工具目录下的 etc目录下 如: 让git log 命令 简化成 gl,配置如...

echojson
29分钟前
0
0
为什么做java开发的公司需要那么多程序员?

透过现象看本质。 Java是企业应用市场的王者,如果一家非互联网公司用Java,那么十有八九是做企业应用的。 所以,这个问题本质上是:为什么做企业应用的公司需要那么多Java程序员。 开发企业...

老道士
31分钟前
3
0
Go Timer实现原理剖析

简介 快速使用 操作介绍

恋恋美食
50分钟前
2
0
记录一个奇怪的问题

环境:jdk1.8虚拟机参数:-verbose:gc -XX:+PrintGCDetails -Xmx20m -Xms20m -Xmn10m -XX:SurvivorRatio=8  -XX:+HeapDumpOnOutOfMemoryError 可以看出,eden占8M却放不下6M数据,发生了......

暗中观察
今天
3
0
rabbitmq安装教程

RabbitMQ有Windows与Linux版本的,这里先写Windows版本的安装。 以前安装软件总是在百度上找某某安装教程,结果能按照教程安装好的软件真的不多。想起先前以为大牛说的一句话,去官网按照官网...

em_aaron
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部