HashMap是无序的
一、 说明
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 == return putForNullKey(value); int hash = int i = for (Entry<K,V> e = table[i]; e != 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、TreeMap、Hashtable、HashSet和ConcurrentHashMap区别
转自:http://blog.csdn.net/paincupid/article/details/47746341 一.HashMap和TreeMap区别 1.HashMap是基于散列表实现的,时间 ...
- hashMap的输出是和加入元素的顺序一样的吗?
hashMap是无序的,同时也不是先进先出的.
- HashMap就是这么简单【源码剖析】
前言 声明,本文用得是jdk1.8 前面已经讲了Collection的总览和剖析List集合以及散列表.Map集合.红黑树的基础了: Collection总览 List集合就这么简单[源码剖析] Ma ...
- Java基础系列--HashMap(JDK1.8)
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/10022092.html Java基础系列-HashMap 1.8 概述 HashMap是 ...
- HashMap源码分析(一)
前言:相信不管在生产过程中还是面试过程中,HashMap出现的几率都非常的大,因此有必要对其源码进行分析,但要注意的是jdk1.8对HashMap进行了大量的优化,因此笔者会根据不同版本对HashMa ...
- TreeMap,HashMap,LinkedHashMap区别,很简单解释
TreeMap,HashMap,LinkedHashMap之间的区别和TreeSet,HashSet,LinkedHashSet之间的区别相似. TreeMap:内部排序. HashMap:无序. L ...
- HashMap、HashTable、ConcurrentHashMap、HashSet区别 线程安全类
HashMap专题:HashMap的实现原理--链表散列 HashTable专题:Hashtable数据存储结构-遍历规则,Hash类型的复杂度为啥都是O(1)-源码分析 Hash,Tree数据结构时 ...
- 【不做标题党,只做纯干货】HashMap在jdk1.7和1.8中的实现
同步首发:http://www.yuanrengu.com/index.php/20181106.html Java集合类的源码是深入学习Java非常好的素材,源码里很多优雅的写法和思路,会让人叹为 ...
- Hashtable、HashMap、TreeMap心得
三者均实现了Map接口,存储的内容是基于key-value的键值对映射,一个映射不能有重复的键,一个键最多只能映射一个值. (1) 元素特性 HashTable中的key.value都不能为null; ...
随机推荐
- 使用std::vector优化点云动画显示一例
1. 准备 使用std::vector应该知道几点: (1)内存连续的容器,有点像数组 (2)与std::list相比,插入和删除元素比较慢- 因为数据迁移 (3)添加元素可能会引发内存分配和数据迁移 ...
- 利用ScrollView滑动属性实现点击查看更多
利用ScrollView的滚动实现点击查看更多 效果图 更新内容布局 <ScrollView android:id="@+id/sv_des" android:layout_ ...
- 移动开发测试工具——Bugtags的集成
移动开发测试工具--Bugtags 官网:https://bugtags.com/ 注册开发者账号 注册账号并激活邮箱,都会就不多做介绍了. 创建应用 创建完账号以后会提示添加应用,点击添加 添加应用 ...
- 讲究门面的Request
为什么说Request讲究门面?注意这里所说的门面并非我们常理解的外表的意思,其实是说它使用了门面设计模式,门面的使用主要用于数据安全的考虑.一个大的系统体系的多个子系统之间涉及交互通信.一个系统中的 ...
- 学习笔记-JS公开课二
typeof运算符的使用 JS中内置对象Array/Date/Math/String可以看成引用类型 做如下测试: <scripttype="text/javascript" ...
- Java项目源码为什么要做代码混淆(解释的很好)
代码混淆,是将计算机程序的代码转换成一种功能上等价,但是难于阅读和理解的形式的行为.代码混淆可以用于程序源代码,也可以用于程序编译而成的中间代码.执行代码混淆的程序被称作代码混淆器.目前已经存在许多种 ...
- Dynamics CRM Microsoft SQL Server 指定的数据库具有更高的版本
在做NLB部署时遇到这么个问题,CRMAPP1安装的CRM版本是6.1已经打了SP1补丁,而在CRMAPP2上的CRM安装包是6.0版本,在选择连接现有部署后,最后一步检测就出了问题,如下图所示. 看 ...
- [GitHub]第一讲:浏览器中使用GitHub
文章转载自http://blog.csdn.net/loadsong/article/details/51591407 看到一篇关于GitHub的文章,感觉不错,因此转载来以备推敲学习. 不会用 Gi ...
- 读生产环境下go语言最佳实践有感
最近看了一篇关于go产品开发最佳实践的文章,go-in-procution.作者总结了他们在用go开发过程中的很多实际经验,我们很多其实也用到了,鉴于此,这里就简单的写写读后感,后续我也争取能将这篇文 ...
- Java进阶(六)Java反射机制可恶问题NoSuchFieldException
作为一种重要特性,Java反射机制在很多地方会用到.在此做一小结,供朋友们参考. 首先从一个问题开始着手. 可恶的问题又来了,NoSuchFieldException,如下图所示: 完全不知道这个qu ...