HashMap的实现原理及其特点

HashMap的实现原理及其特点

2018年03月15日 20:43:08 阅读数:11045更多

个人分类: Java基础知识点

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lovewebeye/article/details/79573702

1) HashMap可以接受null键值和值,而HashTable则不能,HashMap是非synchronized的;存储的是键值对。

2) HashMap是基于hashing原理,使用put(key,value)存储对象到HashMap中,使用get(key)从HashMap中获取对象,当我们给put方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来存储键对象和值对象,作为Map.Entry.

3) 如果两个对象hashCode相同:

存储时:他们会找到相同的bucket位置,发生碰撞,因为HashMap使用链表存储对象(每个Map.Entry都有一个next指针),这个Entry会存储在链表中。

获取时:会用hashCode找到bucket位置,然后调用key.equals()方法找到链表中正确的节点.最终找到要找的值对象.

减少碰撞:使用final修饰的对象、或不可变的对象作为键,使用(Integer、String)(是不可变、final的,而且已经重写了equals和hashCode方法)这样的wrapper类作为键是非常好的,(我们可以使用自定义的对象作为键吗?答:当然可以,只要它遵守了equals和hashCode方法定义规则,并且当对象插入到Map中之后将不会再改变。)

4) HashMap负载因子默认是0.75,可设置,当map填满了75%的bucket时候,将会创建原来HashMap大小两倍的bucket数组,来重新调整map的大小,并将原来的对象放入新的bucket数组中,这个过程叫做rehashing,因为它调用hash方法找到新的bucket位置。

5) 重新调整map大小可能会发生竞争问题:如果两个线程都发现HashMap需要调整大小了,它们都会尝试进行调整,在调整中,存储在链表中的元素的次序会反过来,因为移动bucket位置的时候,HashMap并不会将元素放在链表的尾部,而是放在头部,这是为了避免尾部遍历,如果条件竞争发生了,就死循环了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328550.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重写equals就必须重写hashCode的原理分析

转载自 重写equals就必须重写hashCode的原理分析因为最近在整理Java集合的源码, 所以今天再来谈谈这个古老的话题,因为后面讲HashMap会用到这个知识点, 所以重新梳理下。如果不被重写(原生Object)的hashCode和equals是…

mysql unique count_MySQL - Count Number of Unique Values

问题If I have three columns:orderNumber, name, emailand I would like to count how many unique emails are in the table how would I go about doing so?A statement like:SELECT count(email) FROM ordersgives me the total count.I tried SELECT DISTINCT count(emai…

如何在 ASP.NET MVC 中集成 AngularJS(2)

在如何在 ASP.NET MVC 中集成 AngularJS(1)中,我们介绍了 ASP.NET MVC 捆绑和压缩、应用程序版本自动刷新和工程构建等内容。 下面介绍如何在 ASP.NET MVC 中集成 AngularJS 的第二部分。 ASP.NET 捆绑和压缩 CSS 和 JavaScript 的捆绑与压缩功能是 ASP.NET MVC 最流…

bean交个spring和new比较区别

在spring的配置文件中我们要使用DataSource这个对吧 这个bean将会被多个bean引用 通过ref"dateSource"这个引用 当我们要修改这个只要修改引用就好了 不需要修改很多了 主要是解耦 比如你有一个A类 在好几个类里边要调用到A的方法 new的话就要在每个类里都new…

什么是中间件

转载自 什么是中间件什么是中间件? 中间件就是程序中可织入的,可重用的,与业务逻辑无关的各种组件。中间件( middleware )是基础软件的一大类,属于可复用软件的范畴。顾名思义,中 间件处于操作…

guid判断是否有效_让我们一起啃算法----有效的括号

有效括号(Valid-Parentheses)题干如下:给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:1.左括号必须用…

小白科普:从输入网址到最后浏览器呈现页面内容,中间发生了什么?

转载自 小白科普:从输入网址到最后浏览器呈现页面内容,中间发生了什么? 1、前言 这篇文章是应网友之邀所写,主要描述一下我们访问网站时, 从输入网址到最后浏览器呈现内容,中间发生了什么。 之前写过两…

面试官角度的JVM面试

一个面试官对JVM面试问题的分析 2017年02月19日 21:51:34 阅读数:18135 标签: 面试官JVM面试问题分析 更多 个人分类: JVM 这个帖子的背景是今晚看到je上这张贴:http://www.iteye.com/topic/715256,心血来潮写下的文…

如何在 ASP.NET MVC 中集成 AngularJS(3)

今天来为大家介绍如何在 ASP.NET MVC 中集成 AngularJS 的最后一部分内容。 调试路由表 - HTML 缓存清除 就在我以为示例应用程序完成之后,我意识到,我必须提供两个版本的路由表:一个运行在调试模式的应用程序下和一个运行在发布模式的应用程…

小菜:关于main方法的面试题

转载自 小菜:关于main方法的面试题问题:如果main方法被声明为private会怎样? 答案:能正常编译,但运行的时候会提示“main方法不是public的”。问题:如果去掉了main方法的static修饰符会怎样? 答…

kali linux改中文_kali linux 2019.4设置为中文方法

就在前天,2019年11月26日,kali Linux官网发布了最新版本:Kali Linux 2019.4发行版,此版本和之前相比变动很大,系统界面、主题、壁纸都灿然一新。Kali Linux2019.4版本包括了一些令人兴奋的新更新:一个新的默认桌面环境…

构建高可用ZooKeeper集群

ZooKeeper 是 Apache 的一个顶级项目,为分布式应用提供高效、高可用的分布式协调服务,提供了诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知和分布式锁等分布式基础服务。由于 ZooKeeper 便捷的使用方式、卓越的性能和良好的稳定性&#xff0c…

面试官角度弹面试

http://www.iteye.com/topic/715304 这个帖子的背景是今晚看到je上这张贴:http://www.iteye.com/topic/715256,心血来潮写下的文字,如果能抛砖引玉,能有其他面试官分析一下自己面试时问的问题,那或许是件很有意义的事…

面试经历—广州YY(欢聚时代)

转载自 面试经历—广州YY(欢聚时代) 上周去YY(欢聚时代)面试JAVA工程师,现在回忆一下当时的面试过程,面试问的问题有:1、常用的集合类HashMap、HashTable、ArrayList、LinkedList、HashSet2、…

mysql binlog 备份恢复数据_Mysql结合备份+binlog恢复误删除操作数据

结合备份binlog恢复数据。场景:昨天晚上做了全备,今天上午用户不小心误删除某张表。解决方案:不建议在原生产环境直接恢复,建议在另一台机器恢复全库日志,然后导入到生产环境。1) 创建表select now();create table itp…

你们也只剩下点赞的交情

作者|北及企鹅 微信|叁禁 01 你们有没有这样的朋友,他们在你的世界里扮演着退化的角色。 也许友谊的开始只是小学一年级的时候他对你说了一声“我也喜欢看小丸子。”你们就手拉手肩并肩当了很久的密友。 也许是因为初中那次你俩都没交作业一起在楼道罚站&#xff0…

IBM® Bluemix 上运行ASP.NET Core

IBM Bluemix 上的“ASP.NET 核心”运行时采用“ASP.NET 核心”buildpack 技术。“ASP.NET 核心”是用于构建 .NET Web 应用程序的模块化开放式源代码框架。“.Net 核心”是跨平台的小型运行时,可由“ASP.NET 核心”应用程序实现。将它们相结合可实现基于云的先进 We…

拦截器 和过滤器

https://blog.csdn.net/zxd1435513775/article/details/80556034 拦截器(Interceptor)和过滤器(Filter)的执行顺序和区别 2018年06月03日 13:31:00 止步前行 阅读数:2871 标签: FilterInterceptorControll…

解析HTTP协议六种请求方法,get,head,put,delete,post有什么区别

转载自 解析HTTP协议六种请求方法,get,head,put,delete,post有什么区别 标准Http协议支持六种请求方法,即: 1、GET 2、POST 3、PUT 4、Delete 5、HEAD 6、Options 但其实我们大部分情况下只用到了GET和POST。如果想设计一个符合RESTful规范的web…

攻城掠地端mysql_【图片】攻城掠地单机版本服务端+攻城掠地GM工具【单兆权吧】_百度贴吧...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼player_wepon 兵器 宝石修改.1,为1级宝石  1001,1级晶石修改最好手动修改,手自进阶  最多改六个一多出错player_tickets  点卷改修activity    活动表store_house  背包表p…