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关键字)

HashMap是无序的

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

HashMap是无序的

一、 说明 HashMap是基于哈希表Map的实现。设计初衷主要是为了解决键值(key-value)对应关联的,HashMap的优势是可以很快的根据键(key)找到该键对应的值(value),但是我...
  • longshenlmj
  • longshenlmj
  • 2013年12月02日 18:15
  • 1019

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

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

将无序Map准换为有序的TreeMap

map中hashmap和treemap的介绍,将无序map转换为有序的TreeMap
  • bbqq2012
  • bbqq2012
  • 2015年06月01日 16:54
  • 4413

js模拟HashMap的存储结构-无序版

js中没有合适的HashMap结构,非常的不方便,于是自己小小的模拟了下java中的Map结构, 函数名和Java中相同的其用法保持高度的一致!熟悉使用java的使用起来会非常爽!模拟的是没有顺序不会...
  • zzzqqqzq
  • zzzqqqzq
  • 2016年12月21日 16:15
  • 5155

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

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

HashMap遍历和使用

Hashmap的几种遍历方式: hashmap和hashtable的区别
  • zhangfengBX
  • zhangfengBX
  • 2017年08月06日 17:29
  • 2277

HashSet真的是无序的吗?

首先声明:我用的是JDK1.6,因为才学Java不久,所以写的是很肤浅的东西,高手可以直接略过或鄙视,希望能给那些像我一样的新手带来帮助!                   好了,喝口水滋润一...
  • snail_rao
  • snail_rao
  • 2012年03月11日 09:54
  • 5249

Java中的map集合顺序如何与添加顺序一样

一般使用map用的最多的就是hashmap,但是hashmap里面的元素是不按添加顺序的,那么除了使用hashmap外,还有什么map接口的实现类可以用呢? 这里有2个,但是,要达到我们的要求:按添加...
  • qq_27093465
  • qq_27093465
  • 2017年05月24日 14:47
  • 11828

js模拟HashMap的存储结构-无序版

js中没有合适的HashMap结构,非常的不方便,于是自己小小的模拟了下java中的Map结构, 函数名和Java中相同的其用法保持高度的一致!熟悉使用java的使用起来会非常爽!模拟的是没有顺序不会...
  • zzzqqqzq
  • zzzqqqzq
  • 2016年12月21日 16:15
  • 5155
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HashMap是无序的
举报原因:
原因补充:

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