HashMap是无序的

转载 2013年12月02日 18:15:53

一、 说明

HashMap是基于哈希表Map的实现。设计初衷主要是为了解决键值(key-value)对应关联的,HashMap的优势是可以很快的根据键(key)找到该键对应的值(value),但是我们在使用的过程中需要注意一下,HashMap是一种无序的存储结构。HashMap的实现是假定元素是放在一个圆形的环上,每次put进来的元素根据其hashCode计算该元素在圆环上索引,把该元素放到合适的位置。

二、 Put和get关键方法

public V put(K key, V value) {

if (key == null)

return putForNullKey(value);

当传入的key为null时,则直接调用putForNullKey方法,在索引为0的位置压入该value值,这也就是HashMap为什么支持压入null值。

int hash = hash(key.hashCode());

int i = indexFor(hash, table.length);

这两个方法是很牛X的地方,第一个方法是根据key的hashCode利用hash方法生成一个hash值,然后通过indexFor函数获取table的索引值。

是的,没错,HashMap就是通过table的结构来存储数据的。HashMap最牛X的地方是能根据hash值计算出正确的索引,比较深奥。下面是put的整个方法:

public V put(K key, V value) {

if (key == null)

return putForNullKey(value);

int hash = hash(key.hashCode());

int i = indexFor(hash, table.length);

for (Entry<K,V> e = table[i]; e != null; e = e.next) {

Object k;

if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {

V oldValue = e.value;

e.value = value;

e.recordAccess(this);

return oldValue;

}

}

modCount++;

addEntry(hash, key, value, i);

return null;

}

实际上,如果插入的数据在HashMap中已经存在,则调用put函数的时候会返回oldValue。当我们在使用get函数的时候,同样是根据key的hashCode,从table中的对应索引位置提取该值并返回。

到这里,我们可以看到HashMap是通过key的hashCode来计算索引的,与元素放入的先后顺序没有什么关系,所以我们在使用HashMap的时候,千万不要寄希望于HashMap中的数据与我们压入的数据的先后顺序一致。如果要保证压入的顺序一致,可以使用LinkedHashMap对象。

三、 HashMap与HashTable的区别

1. HashMap允许put进来一个null元素,HashTable则不允许,put进来null值后抛异常

2. HashMap的一些操作(如put)没有同步,而HashTable的很多操作都是加上同步操作(增加了synchronized关键字)

相关文章推荐

Android异常--无序HashMap导致Android5.0及5.0以后的手机连接服务器异常

前言 手上的一个项目,在我测试用的手机上都正常,今天在同事手机上登录失败.测试排查之后发现Android系统版本上面map内顺序排列不同的原因导致的. 错误原因分析  项目是采用socket通信,访...

HashMap源码分析,为什么是无序的?

疑问:HashMap是无序的,怎么做到的?先看一个现象Map m = new HashMap(); for(int i=0; i...
  • zgengen
  • zgengen
  • 2017年01月17日 22:51
  • 1222

HashMap是无序的

HashMap是无序的 一、   说明 HashMap是基于哈希表Map的实现。HashMap的设计初衷主要是为了解决键值(key-value)对应的关联的,HashMap的优势是可以很快的根据键...

从n个无序的数中选出m个最大数

从n个无序的数中选出m个最大数

无序安装的远程连线工具TeamViewer

  • 2010年04月27日 09:36
  • 2.69MB
  • 下载

Longest Consecutive Sequence 从无序数组中找最长的连续数字 @LeetCode

又是一道Hashtable或者HashSet的空间换时间的题! package Level3; import java.util.HashSet; import java.util.Set; ...

无序数组排序

  • 2013年04月27日 17:17
  • 156KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HashMap是无序的
举报原因:
原因补充:

(最多只允许输入30个字)