hashmap

HashCode与Equals回顾

折月煮酒 提交于 2020-03-13 00:53:47
HashSet和HashMap一直都是JDK中最常用的两个类, HashSet要求不能存储相同的对象,HashMap要求不能存储相同的键 。 那么Java运行时环境是如何判断HashSet中相同对象、HashMap中相同键的呢?当存储了“相同的东西”之后Java运行时环境又将如何来维护呢? 在研究这个问题之前,首先说明一下JDK对equals(Object obj)和hashcode()这两个方法的定义和规范: (1) 在Java中任何一个对象都具备equals(Object obj)和hashcode()这两个方法 ,因为他们是在Object类中定义的。 equals(Object obj)方法用来判断两个对象是否“相同”,如果“相同”则返回true,否则返回false。 hashcode()方法返回一个int数,在Object类中的默认实现是“将该对象的内部地址转换成一个整数返回”。 (2)接下来有两个个关于这两个方法的重要规范(我只是抽取了最重要的两个,其实不止两个): 规范1 : 若重写equals(Object obj)方法,有必要重写hashcode()方法(避免不必要的麻烦) ,确保通过equals(Object obj)方法判断结果为true的两个对象具备相等的hashcode()返回值。说得简单点就是:“如果两个对象相同,那么他们的hashcode应该 相等”

HashMap实现原理分析

别说谁变了你拦得住时间么 提交于 2020-03-12 05:55:12
1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端。 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大。但数组的二分查找时间复杂度小,为O(1);数组的特点是:寻址容易,插入和删除困难; 链表 链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N)。 链表 的特点是:寻址困难,插入和删除容易。 哈希表 那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表。哈希表((Hash table)既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便。   哈希表有多种不同的实现方法,我接下来解释的是最常用的一种方法—— 拉链法,我们可以理解为“ 链表的数组 ” ,如图:   从上图我们可以发现哈希表是由 数组+链表 组成的,一个长度为16的数组中,每个元素存储的是一个链表的头结点。那么这些元素是按照什么样的规则存储到数组中呢。一般情况是通过hash(key)%len获得,也就是元素的key的哈希值对数组长度取模得到。比如上述哈希表中,12%16=12,28%16=12,108%16=12,140%16=12。所以12、28、108以及140都存储在数组下标为12的位置。   HashMap其实也是一个线性的数组实现的

20200311——java面试集合 深入HashMap 二

扶醉桌前 提交于 2020-03-12 03:53:43
ArrayList、Vector、LinkedList的存储性能和特性 ArrayList 和Vector都是使用数组方式存储数据 ,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector中的方法由于添加了synchronized修饰,因此Vector是线程安全的容器,但性能上较ArrayList差,因此已经是Java中的遗留容器。 LinkedList使用 双向链表 实现存储(将内存中零散的内存单元通过附加的引用关联起来,形成一个可以按序号索引的线性结构,这种链式存储方式与数组的连续存储方式相比,内存的利用率更高), 按序号索引数据需要进行前向或后向遍历 ,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。 TreeMap的底层实现 TreeMap 的实现就是红黑树数据结构,也就说是一棵自平衡的排序二叉树,这样就可以保证当需要快速检索指定节点。 红黑树的插入、删除、遍历时间复杂度都为O(lgN),所以性能上低于哈希表。但是哈希表无法提供键值对的有序输出,红黑树因为是排序插入的,可以按照键的值的大小有序输出。红黑树性质: 性质1:每个节点要么是红色,要么是黑色。 性质2:根节点永远是黑色的。 性质3:所有的叶节点都是空节点(即 null),并且是黑色的。 性质4

HashMap和Hashtable的区别。

守給你的承諾、 提交于 2020-03-11 22:25:18
1 HashMap不是线程安全的 hastmap是一个接口 是map接口的实现类,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。HashMap允许null key和null value,而hashtable不允许。 2 HashTable是线程安全的一个Collection。 HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。 HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。 Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。 最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概一样

HashMap详解

爷,独闯天下 提交于 2020-03-11 19:26:50
hashmap的数据结构 Hashmap的底层数据结构是由数组+链表组成的,是线程不安全,允许key和value为null。底层结构数组叫哈希桶,而桶内则是链表,链表中的节点Node存放着实际的元素。 JDK 1.8 以前 HashMap 的实现是 数组+链表,即使哈希函数取得再好,也很难达到元素百分百均匀分布。 当 HashMap 中有大量的元素都存放到同一个桶中时,这个桶下有一条长长的链表,这个时候 HashMap 就相当于一个单链表,假如单链表有 n 个元素,遍历的时间复杂度就是 O(n),完全失去了它的优势。 针对这种情况,JDK 1.8 中引入了 红黑树(查找时间复杂度为 O(logn))来优化这个问题。 新增的操作:桶的树形化 treeifyBin() 新增的操作: 红黑树中添加元素 putTreeVal() 新增的操作: 红黑树中查找元素 getTreeNode() 新增的操作: 树形结构修剪 split() JDK 1.8 以后哈希表的 添加、删除、查找、扩容方法都增加了一种 节点为 TreeNode 的情况: 添加时,当桶中链表个数超过 8 时会转换成红黑树; 删除、扩容时,如果桶中结构为红黑树,并且树中元素个数太少的话,会进行修剪或者直接还原成链表结构; 查找时即使哈希函数不优,大量元素集中在一个桶中,由于有红黑树结构,性能也不会差。 (图片来自:http:/

HashMap源码分析(jdk12)

房东的猫 提交于 2020-03-10 15:06:41
1. 初始化 ,hashMap初始化容量默认大小为16,默认负载因子为0.75F 一共有3个构造器 无参 带初始化容量 带初始化容量和初始化加载因子 前两个构造器都是调用第三个构造器。如果没有设置初始化容量或负载因子,以默认值创建。值得一提的是: 在调用构造器创建HashMap时不会立即创建容器,(在jdk1.8之后为 Node<K,V>[] table 用于存储键值对)。而是会在你第一次put元素的时候调用resize方法创建。 容器的大小必须为2的倍数。你在设置初始化容器大小时,如果输入的不是2的倍数,那会自动调整为最接近的大于输入值的2的倍数。主要在tableSizeFor这个方法实现。 该方法,先获取 输入数-1 的32位二进制前导零数目(这里-1理解一下就好了,不-1那对于恰好是2的倍数的,会扩大一倍)。-1无符号右移前导零数目位,这样就得到了最接近 输入数 的 2的倍数-1。最后判断n的大小, 如果n=-1表示cap=1,那就设置容量为1; 如果n>0,如果大于最大容量,那就设置为最大容量,否则设置为n+1。 hashMap有最大容量。2^30 链表长度阈值 当长度大于8时,会从链表转化为红黑树。至于为什么设置为8主要是理想状态下,设置合理的HashMap,根据泊松分布计算得到链表长度达到8的概率极低( 0.00000006)

学生信息管理系统(SSM+JSP)

拟墨画扇 提交于 2020-03-10 06:15:25
学生信息管理系统(SSM+JSP) 1.管理员主要功能有学生管理,课程管理,奖惩管理,综合素质登记,成绩管理。 2.学生主要功能有,修改个人信息,包括首次修改默认密码,学生选课,成绩查看,绩点查询。 3.页面使用Bootstrap框架和EasyUI,后台使用Spring、SpringMVC和MyBatis框架。 4.JDK1.8 tomcat7 idea2017 MySQL5.5 由xpsviewer修改,完善。 (用于课程设计) 1.管理端添加学生请假管理和学生宿舍信息管理。 2.学生端添加学生奖励,处罚记录查看,学生素质分查看,学生住宿信息查看,学生请假。 3.完善登陆检查,防止非法未授权登陆。 4.完善部分输入检查。 5.将项目打包成maven项目,更新spring和spring mvc版本 方便搭建。 6.奖励,处罚,素质添加时间,满足实际需求。 7.添加修改学生,管理员密码功能。 8.增加宿舍片区管理。 9.完善数据库约束设计与触发器,有效减少脏数据。 自带数据库sql和详细搭建说明文档,由于以前不会用git,所有修改提交已经丢失,不能diff每个功能的差异,不过代码可读性尚可。 下载地址 https://github.com/21503882/studentinfo @Controller @RequestMapping(value = "/stu/stuManager

字节跳动面试官这样问我HashMap,我刚好都会!

↘锁芯ラ 提交于 2020-03-09 10:46:05
前言 作为一个在互联网公司面一次拿一次Offer的面霸,打败了无数竞争对手,每次都只能看到无数落寞的身影失望的离开,略感愧疚( 请允许我使用一下夸张的修辞手法 )。 于是在一个寂寞难耐的夜晚,我痛定思痛,决定开始写互联网技术栈面试相关的文章,希望能帮助各位读者以后面试势如破竹,对面试官进行360°的反击,吊打问你的面试官,让一同面试的同僚瞠目结舌,疯狂收割大厂Offer! 所有文章的名字只是我的噱头,我们应该有一颗谦逊的心,所以希望大家怀着空杯心态好好学,一起进步。 正文 一个婀娜多姿,穿着衬衣的小姐姐,拿着一个精致的小笔记本,径直走过来坐在我的面前。 看着眼前这个美丽的女人,心想这不会就是Java基础系列的面试官吧,真香。 不过看样子这么年轻应该问不出什么深度的吧,嘻嘻。(哦?是么😏) 小伙子,听前面的面试官说了,你Redis和消息队列都回答得不错,看来还是有点东西。 美丽迷人的面试官您好,您见笑了,全靠看了敖丙的《吊打面试官》系列,不然我还真的回答不上很多原本的知识盲区,他真的有点东西。 面试官心想:哦,吊打面试官是么,那今天我就让你知道,吊打这两个字怎么写的吧,年轻人啊,提前为你感到惋惜。 嗯嗯小帅比,虽然前面的技术栈没啥太大的瑕疵,不过未来很长的一段时间我会用一期期的基础教你做人的,你要准备好哟! 好了我们开始今天的面试吧,小伙子你了解数据结构中的HashMap么

java基础(三)hashMap底层原理

戏子无情 提交于 2020-03-08 17:29:59
HashMap底层原理 hashMap底层原理主要是jdk1.7和1.8以上的区别。 jdk1.7中底层是由数组(也有叫做“位桶”的)+链表实现;jdk1.8中底层是由数组+链表/红黑树实现。 参考学习: https://blog.csdn.net/jswd_50x/article/details/86542240 HashMap面试题 1.谈一下HashMap的特性? 2.谈一下HashMap的底层原理是什么? 3.谈一下hashMap中put是如何实现的? 4.谈一下hashMap中什么时候需要进行扩容,扩容resize()又是如何实现的? 5.谈一下hashMap中get是如何实现的? 6.谈一下HashMap中hash函数是怎么实现的?还有哪些hash函数的实现方式? 7.为什么不直接将key作为哈希值而是与高16位做异或运算? 8.为什么是16?为什么必须是2的幂?如果输入值不是2的幂比如10会怎么样? https://blog.csdn.net/sidihuo/article/details/78489820 https://blog.csdn.net/eaphyy/article/details/84386313 9.谈一下当两个对象的hashCode相等时会怎么样? 10.如果两个键的hashcode相同,你如何获取值对象? 11.

java中HashMap的用法

时间秒杀一切 提交于 2020-03-08 16:03:38
重点介绍HashMap。首先介绍一下什么是Map。在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value。在下文中会有例子具体说明。 再来看看HashMap和TreeMap有什么区别。HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。 import java.util.Map; import java.util.HashMap; import java.util.Set; import java.util.HashSet; import java.util.Iterator; import java.util.Hashtable; import java.util.TreeMap; class HashMaps { public static void main(String[] args) { Map map=new HashMap(); map.put("a", "aaa"); map.put("b", "bbb"); map.put("c", "ccc"); map.put("d", "ddd"); Iterator iterator =