Java中HashMap的实现原理
来源:互联网 发布:淘宝商家购买运费险 编辑:程序博客网 时间:2024/04/26 01:11
一、Java中的hashCode和equals
1、关于hashCode
hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的
如果两个对象相同,就是适用于equals(java.lang.Object) 方法,那么这两个对象的hashCode一定要相同
如果对象的equals方法被重写,那么对象的hashCode也尽量重写,并且产生hashCode使用的对象,一定要和equals方法中使用的一致,否则就会违反上面提到的第2点
两个对象的hashCode相同,并不一定表示两个对象就相同,也就是不一定适用于equals(java.lang.Object) 方法,只能够说明这两个对象在散列存储结构中,如Hashtable,他们“存放在同一个篮子里“
再归纳一下就是hashCode是用于查找使用的,而equals是用于比较两个对象的是否相等的。
2、关于equals
1.equals和==
==用于比较引用和比较基本数据类型时具有不同的功能:
比较基本数据类型,如果两个值相同,则结果为true
而在比较引用时,如果引用指向内存中的同一对象,结果为true;
equals()作为方法,实现对象的比较。由于==运算符不允许我们进行覆盖,也就是说它限制了我们的表达。因此我们复写equals()方法,达到比较对象内容是否相同的目的。而这些通过==运算符是做不到的。
2.object类的equals()方法的比较规则为:如果两个对象的类型一致,并且内容一致,则返回true,这些类有:
java.io.file,java.util.Date,java.lang.string,包装类(Integer,Double等)
String s1=new String(“abc”);
String s2=new String(“abc”);
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
运行结果为false true
二、HashMap的实现原理
1. HashMap概述
- 1
- 2
- 3
- 4
从上图中可以看出,HashMap底层就是一个数组结构,数组中的每一项又是一个链表。当新建一个HashMap的时候,就会初始化一个数组。
其中Java源码如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
可以看出,Entry就是数组中的元素,每个 Map.Entry 其实就是一个key-value对,它持有一个指向下一个元素的引用,这就构成了链表。
2、HashMap实现存储和读取
1)存储
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
根据hash值得到这个元素在数组中的位置(即下标),如果数组该位置上已经存放有其他元素了,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。如果数组该位置上没有元素,就直接将该元素放到此数组中的该位置上。
hash(int h)方法根据key的hashCode重新计算一次散列。此算法加入了高位计算,防止低位不变,高位变化时,造成的hash冲突。
2)读取
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
从HashMap中get元素时,首先计算key的hashCode,找到数组中对应位置的某一元素,然后通过key的equals方法在对应位置的链表中找到需要的元素。
3)归纳起来简单地说,HashMap 在底层将 key-value 当成一个整体进行处理,这个整体就是一个 Entry 对象。HashMap 底层采用一个 Entry[] 数组来保存所有的 key-value 对,当需要存储一个 Entry 对象时,会根据hash算法来决定其在数组中的存储位置,在根据equals方法决定其在该数组位置上的链表中的存储位置;当需要取出一个Entry时,也会根据hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该Entry。
- Java中HashMap的实现原理
- java中Hashmap的实现原理
- java中Hashmap的实现原理
- java中Hashmap的实现原理
- Java中HashMap的实现原理
- Java集合中HashMap的实现原理
- Java中HashMap的实现原理
- Java中HashMap的实现原理分析
- Java中HashMap的实现原理
- Java中HashMap的实现原理
- Java中HashMap的实现原理
- Java中HashMap的实现原理
- Java中HashMap的实现原理
- Java中HashMap的实现原理
- Java中HashMap的实现原理
- java中HashMap实现原理
- Java的HashMap实现原理
- java HashMap的实现原理
- 第十五周项目1(1)-验证算法(直接插入排序)
- ICMP
- 秦皇岛虚拟现实:步入VR虚拟现实行业是否是正确的选择
- 用C打印1000年到2000年之间的润年
- 第十五周——项目一—验证算法(8)基数排序
- Java中HashMap的实现原理
- 多线程学习
- C# Delegate/Event代码示例
- Android开发中线程池的使用
- windows安装laravel框架
- eclipse中字母大小写转换快捷键
- Mybatis javaType jdbcType
- centos yum升级到mysql 5.6 指定版本 平滑升级
- 第11周项目3- 图遍历算法实现