1、HashMap的数据结构(HashMap通过hashcode对其内容进行快速查找,是无序的)
数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端。
数组 :数组的存储区是连续的,占用内存严重,故空间复杂度很大。但数组的二分查找时间度小;数组的特点:寻址容易,插入和
删除困难。
链表 :链表的储存区离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度大;链表的特点:寻址困难,插入和删除容易。
哈希表
HashMap是由数组+链表组成;寻址容易,插入和删除容易。(存储单元数组Entry[],数组里面包含链表)
HashMap其实也是由一个线性的数组实现的。所以可以理解为其存储数据的容器就是一个线性容器;
HashMap里面有一个内部静态类Entry,其重要的属性有key,value,next,从属性key,value 就可以很明显的看出来 Entry就是
HashMap键值对实现的一个基础bean;也就是说HashMap的基础就是一个线性数组,这个数组就是Entry[],Map里面的内容都保存
在Entry[]中;
来自 <http://blog.csdn.net/hu948162999/article/details/42118555>
HashMap存储结构图
这里先给出HashMap的存储结构,在后面的源码分析中,我们将更加详细的对此作介绍。HashMap采取数组加链表的存储方式来实现。亦即数组(散列桶)中的每一个元素都是链表,如下图:
图2-1
说明:下面针对HashMap的源码分析中,所有提到的桶或散列桶都表示存储结构中数组的元素,桶或散列桶的数量亦即表示数组的长度,哈希码亦即散列码
来自 <http://www.cnblogs.com/rogerluo1986/p/5851300.html>
HashMap其实也是一个线性的数组实现的,所以可以理解为其存储数据的容器就是一个线性数组。这可能让我们很不解,一个线性的数组怎么实现按键值对来存取数据呢?这里HashMap有做一些处理。
首先HashMap里面实现一个静态内部类Entry,其重要的属性有 key , value, next,从属性key,value我们就能很明显的看出来Entry就是HashMap键值对实现的一个基础bean,我们上面说到HashMap的基础就是一个线性数组,这个数组就是Entry[],Map里面的内容都保存在Entry[]里面。
/**
* The table, resized as necessary. Length MUST Always be a power of two.
*/
transient Entry[] table;
来自 <http://blog.csdn.net/vking_wang/article/details/14166593>
HashMap的使用那么简单,那么问题来了,它是怎么存储的,他的存储结构是怎样的,很多程序员都不知道,其实当你put和get的时候,稍稍往前一步,你看到就是它的真面目。其实简单的说HashMap的存储结构是由数组和链表共同完成的
来自 <http://www.cnblogs.com/wuhuangdi/p/4175991.html>