Java中HashMap的数据结构

类声明:

概述:

  • 线程不安全;
  • <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[]中,如下图所示。

时间: 2024-11-09 07:00:43

Java中HashMap的数据结构的相关文章

[转]java 的HashMap底层数据结构

java 的HashMap底层数据结构 HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在.在HashMap中,key-value总是会当做一个整体来处理,系统会根据hash算法来来计算key-value的存储位置,我们总是可以通过key快速地存.取value.下面就来分析HashMap的存取. 一.定义 HashMap实现了Map接口,继承AbstractMap.其中Map接口定义了键映射到值的规则,而AbstractM

java学习笔记——Java中HashMap和TreeMap的区别深入理解

本文转载自Java中HashMap和TreeMap的区别深入理解 首先介绍一下什么是Map.在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.这就是我们平时说的键值对. HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的). HashMap 非线程安全 

JAVA中hashmap的分析

从http://blog.csdn.net/luanlouis/article/details/41576373?utm_source=tuicool&utm_medium=referral学习到了java中hashmap的内部原理,非常不错的文章,非常感谢作者的奉献.以下为主要内容摘录. java/scala/c# 语言之中,class 都会含有hashcode,equals之类的方法,这是为什么?数组和链表的区别是什么?在编程开发中应该如何使用?在HashMap内部,采用了数组+链表的形式来

java中 HashMap和Hashtable,list、set和map 的区别

摘自: http://blog.chinaunix.net/uid-7374279-id-2057584.html HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable.HashMap允许将null作为一个entry的key或者value,而Hashtable不允许.HashMap把Hashtable的contains方法去掉了,改成contains

Java中HashMap的实现原理

最近面试中被问及Java中HashMap的原理,瞬间无言以对,因此痛定思痛觉得研究一番. 一.Java中的hashCode和equals 1.关于hashCode hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的 如果两个对象相同,就是适用于equals(java.lang.Object) 方法,那么这两个对象的hashCode一定要相同 如果对象的equals方法被重写,那么对象的hashCode也

【转】 java中HashMap详解

原文网址:http://blog.csdn.net/caihaijiang/article/details/6280251 java中HashMap详解 HashMap 和 HashSet 是 Java Collection Framework 的两个重要成员,其中 HashMap 是 Map 接口的常用实现类,HashSet 是 Set 接口的常用实现类.虽然 HashMap 和 HashSet 实现的接口规范不同,但它们底层的 Hash 存储机制完全一样,甚至 HashSet 本身就采用 H

Java中的数组数据结构需要了解的要点

. 首先,数组是Java中的对象.它们不是像int.short或long这样的基本类,也不是具有很多方法的全功能对象,但由于它们是对象,所以它们隐式地扩展了Object,这就是为什么可以使用数组引用(例如toString())调用java.lang.object的任何方法. Java中数组的另一个重要之处是,一旦创建,就不能更改数组的大小.好奇的开发人员可能会问,我们如何在Java中拥有像ArrayList这样的动态集合,可以在饱和的时候调整自身大小?好吧,扩容不像你想得那样,可以简单地增加一个

Java中HashMap和SparseArray的数据结构

最近听同事说使用SparseArray代替HashMap可以提高性能,于是边对这两个类的数据结构进行简单的分析. Hashmap的数据结构  Hashmap是一个数组和链表的结合体(在数据结构称"链表散列"),如下图示: 图片来源:Java的HashMap和HashTable SparseArray的数据结构 SparseArray指的是稀疏数组(Sparse array),为了节省内存空间,并且不影响数组中原有的内容值.其内部有两个关键成员,分别是mKeys和mValues, 都是数

java 的HashMap底层数据结构

HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在.在HashMap中,key-value总是会当做一个整体来处理,系统会根据hash算法来来计算key-value的存储位置,我们总是可以通过key快速地存.取value.下面就来分析HashMap的存取. 一.定义 HashMap实现了Map接口,继承AbstractMap.其中Map接口定义了键映射到值的规则,而AbstractMap类提供 Map 接口的骨干实现,以最