类声明:

概述:

  • 线程不安全;
  • <Key, Value>两者都可以为null;
  • 不保证映射的顺序,特别是它不保证该顺序恒久不变;
  • HashMap使用Iterator;
  • HashMap中hash数组的默认大小是16,增长方式一定是2的指数倍;

HashMap的数据结构:

  在Java语言中,最基本的结构只有两种,一个是数组,另一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。
  通过分析这两种数据结构的优劣,才能得出HashMap这样设计的缘由:

  • 数组:
      数组存储区间是连续的,可以通过下标迅速访问数组中任何元素,同样,如果想删除一个元素,那么需要移动大量元素,插入操作同理。但占用内存严重,所以空间复杂度很大。不过数组的二分查找时间复杂度小,仅为O(1)。数组的特点是:寻址容易,插入和删除困难。

  • 链表:
      链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,为O(N)。链表的特点是:寻址困难,插入和删除容易。

  • HashMap的选择:哈希表
      哈希表综合了两者的特性,做出一种寻址容易,插入删除也容易的数据结构。哈希表(Hash table)既满足了数据的查找方便,同时不占用太多的内容空间。

  从上图我们可以发现哈希表是由数组+链表组成的,一个长度为16的数组中,每个元素存储的是一个链表的头结点。然后通过hash(key)%len获得元素存储在数组中的下标值,也就是元素的key的哈希值对数组长度取模得到。比如上图的哈希表中,12%16=12,28%16=12,108%16=12,140%16=12。所以12、28、108和140都存储在数组下标为12的位置。

  HashMap实现了一个静态内部类Node,其实现了Map.Entry接口。HashMap中实现的数组就是Node[],Map中的内容都保存在Node[]中,如下图所示。

Java中HashMap实现原理的更多相关文章

  1. Java中HashMap的实现原理

    最近面试中被问及Java中HashMap的原理,瞬间无言以对,因此痛定思痛觉得研究一番. 一.Java中的hashCode和equals 1.关于hashCode hashCode的存在主要是用于查找 ...

  2. Java面试& HashMap实现原理分析

    1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端.  数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O( ...

  3. JAVA中hashmap的分析

    从http://blog.csdn.net/luanlouis/article/details/41576373?utm_source=tuicool&utm_medium=referral学 ...

  4. java中HashMap的设计精妙在哪?

    摘要:本文结合图解和问题,教你一次性搞定HashMap 本文分享自华为云社区<java中HashMap的设计精妙在哪?用图解和几个问题教你一次性搞定HashMap>,作者:breakDaw ...

  5. Java中HashMap遍历的两种方式

    Java中HashMap遍历的两种方式 转]Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml 第一种: ...

  6. 【转】 java中HashMap详解

    原文网址:http://blog.csdn.net/caihaijiang/article/details/6280251 java中HashMap详解 HashMap 和 HashSet 是 Jav ...

  7. java中HashMap详解(转)

    java中HashMap详解 博客分类: JavaSE Java算法JDK编程生活       HashMap 和 HashSet 是 Java Collection Framework 的两个重要成 ...

  8. java集合(2)- java中HashMap详解

    java中HashMap详解 基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了非同步和允许使用 null 之外,HashMap 类与 H ...

  9. JAVA中HashMap相关知识的总结(一)

    Java中HashMap在jdk1.7和jdk1.8中的区别点: 在jdk1.7中是用数组+链表形式存储,1.8采用数组+链表/红黑树形式 Jdk1.8中由链表转为红黑树是长度大于8,由红黑树转为链表 ...

随机推荐

  1. Linux安装SQLite轻量级数据库

    SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中.它是D.RichardHipp建立的公有领域项目.它的设计目标是嵌入式的,而且目前已经在很多嵌入式产 ...

  2. 关于highstock横坐标的一些的一些说明(1)使用UTC时间

    highstock的数据格式采用的是[[时间,数据],[时间,数据],[时间,数据],[时间,数据]],而时间采用的是13位的毫秒值,如[1133136000000,69.66],采用的时间格式为UT ...

  3. JavaScript-各种插件

    上传插件: 首推:uploadify http://www.admin10000.com/document/2980.html 滚动条插件: http://www.admin10000.com/doc ...

  4. Hibernate学习备忘

    1.关于Hibernate异常: org.hibernate.service.jndi.JndiException: Error parsing JNDI name   刚接触Hibernate,调试 ...

  5. 【C++】int与string互转

    int转string(注:itoa不是标准函数,OJ平台可能不接受) ; ]; string str; sprintf(temp, "%d", n); str = temp; or ...

  6. Python学习笔记015——文件file的常规操作(二进制文件)

    有时候诸如图片.音乐等信息不是以文本的形式存储的,而是二进制文件格式存储的. 有时候很多信息不是以文本文件的形式存储的 很多时候,都需要用到二进制读取文件.毕竟很多信息不是以文本的形式存储.例如:图片 ...

  7. 转:使用Mosquitto-Auth-Plugin对mqtt客户端进行验证

    https://www.lixiaodong.com/?p=1631.安装需要的包sudo apt-get install libc-ares-dev libcurl4-openssl-dev lib ...

  8. webdriver API study

    This chapter cover all the interfaces of Selenium WebDriver. Recommended Import Style The API defini ...

  9. Python cos() 函数

    描述 cos() 返回x的弧度的余弦值. 语法 以下是 cos() 方法的语法: import math math.cos(x) 注意:cos()是不能直接访问的,需要导入 math 模块,然后通过 ...

  10. ui-router路由控制器(一)

    angularUI 在不断发展过程中已经被划分成了几个模块,你可以选择你需要的模块载入,我们今天要了解一下路由控制器 ui-router ,它就是angularUI划分出出来的一个独立模块. 此模块只 ...