知识大全 Java HashMap 分析之一:基本结构
Posted 元素
篇首语:愿君学长松,慎勿作桃李。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java HashMap 分析之一:基本结构相关的知识,希望对你有一定的参考价值。
Java HashMap 分析之一:基本结构 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
Java的HashMap非常的常用 本篇研究它的实现算法 最后希望计算出内存占用 性能的量化数据 然后得出什么时候使用HashMap 什么时候不能滥用的结论
HashMap实际上是一个数组 数组里面的每个元素都是一个链表 每个元素在通过put方法放入HashMap中的时候 要按照如下步骤进行 根据该元素自身提供的hashcode计算出散列值 该散列值就是数组的下标 将新元素放入该数组位置的链表中先来看一下数组的定义 [java] view plaincopy /** * The table resized as necessary Length MUST Always be a power of o */ transient Entry[] table
这是一个数组 transient关键字告诉我们它不会参与序列化 既然是一个数组 总有数目上限 也就意味着如果存入HashMap的元素太多 导致数组大小不能够存放所有的链表的时候 数组大小必须要能够调整 所以首先来考察一下数组容量的相关算法
第一 Entry是什么类型?
[java] view plaincopy static class Entry<K V> implements Map Entry<K V> final K key V value Entry<K V> next final int hash
/** * Creates new entry */ Entry(int h K k V v Entry<K V> n) value = v next = n key = k hash = h ……
public final boolean equals(Object o) if (!(o instanceof Map Entry))
return false Map Entry e = (Map Entry)o Object k = getKey() Object k = e getKey() if (k == k || (k != null && k equals(k ))) Object v = getValue() Object v = e getValue() if (v == v || (v != null && v equals(v )))
return true return false
public final int hashCode() return (key==null ? key hashCode()) ^(value==null ? value hashCode()) ……
这是一个HashMap类的内部静态类 实现了Map Entry接口 接受两个模板参数K和V key和hash一旦在构造函数中被初始化 就不可改变 并且由于有next的存在 Entry可以构成一个单向链表
比较重要的是equals和hashCode方法 代码先列出来 后面再解释
第二 初始容量的设定大多数都在下面的构造函数里面 用于指定的initialCapacity不准小于 也不能超过最大值 并且最终的capicity必须是 的n次方 还有如果使用了无参数的构造函数 默认会创建一个拥有 个元素的数组
[java] view plaincopy public HashMap(int initialCapacity float loadFactor) if (initialCapacity < )
throw new IllegalArgumentException( Illegal initial capacity + initialCapacity) if (initialCapacity > MAXIMUM_CAPACITY)
initialCapacity = MAXIMUM_CAPACITY if (loadFactor <= || Float isNaN(loadFactor))
throw new IllegalArgumentException( Illegal load factor + loadFactor)
// Find a power of >= initialCapacity int capacity = while (capacity < initialCapacity)
capacity <<=
this loadFactor = loadFactor threshold = (int)(capacity * loadFactor) table = new Entry[capacity] init()
第三 什么时候应该调整数组的大小?
算法是这样 有一个变量size保存了实际数组已经使用了多少个元素 并且如果size的值达到了变量threshold的值 就必须扩充数组的容量 threshold=capicity*loadFactor capicity是数组最大的容纳元素个数 loadFactor可以在构造函数中制定 否则采用默认值 f capicity的最大值是 << (也就是 的 次方 ) 由此我们可以看到HashMap最多存放 亿多个链表
第四 如何调整数组大小?
答案是 倍 很像C++里面的vector的分配策略
[java] view plaincopy void addEntry(int hash K key V value int bucketIndex) Entry<K V> e = table[bucketIndex] table[bucketIndex] = new Entry<K V>(hash key value e) if (size++ >= threshold)
resize( * table length)
第五 为什么数组大小必须是 的倍数?
cha138/Article/program/Java/hx/201311/25781相关参考
Java中对HashMap的深度分析 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在Java的
java中怎么遍历HashMap 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一 HashM
Java中HashMap的工作机制 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 现在很多的
java.util.HashMap源码要点浅析 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 散
知识大全 JAVA中HashMap(哈希表)的使用(List)方法
JAVA中HashMap(哈希表)的使用(List)方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下
在Java中使用反射分析类结构 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 首先要获取需要进行
如何遍历一个HashMap 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 以下是两种方法遍历Ha
在JAVA中定义类的结构 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 类的基本概念 Ja
hashTable和hashMap的不同 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Hash
算法与数据结构是相辅相承的解决某一特定类型问题的算法可以选定不同的数据结构而且选择恰当与否直接影响算法的效率反之一种数据结构的优劣由各种算法的执行来体现 要设计一个好的算法通常要考虑以下的要求