JAVA中的hash

简介: 一.hashcode()方法 首先hashcode()方法是万类始祖Object自带的一个方法,翻看源码可以知道是一个native方法,也就是说是调用的操作系统底层函数生成的一个值——hashcode。hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值。

一.hashcode()方法

  首先hashcode()方法是万类始祖Object自带的一个方法,翻看源码可以知道是一个native方法,也就是说是调用的操作系统底层函数生成的一个值——hashcode。hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值。

20190724161441956.png

二.hashcode的作用

   hashcode主要的作用是为了提高hash系的数据机构的性能。可以理解为JAVA让每个对象带有hashcode()方法就是为了方便生成hashcode,以供hash算法来使用,最后得到数据应该存储的位置。在《手撕JAVA(九)hash》一文中已经讨论过,hash算法其实就是将数据尽量均匀分布的一个过程。

20190724165716982.png

整个流程下来我们可以发现,所谓hash系的数据结构其实并没有什么特殊,只是在使用过程中用到了hash值而已。


还有一个发现就是只要保证hash值不一样,每条数据算出来的存储位置是不一样的。这就是hash算法的作用,让数据尽量均匀的分散存储。但是在实际情况中存在两个问题:


1.hash冲突,不同对象运算出来的hash值可能会相同,那么hash算法算出来的位置值也相同。


2.随着需要存储的数据量的增加,hash表不可能无限扩容。


JAVA给出的解决办法就是hashMap

三.hashMap

先来看一下hashMap长什么样子

20190724170949457.png

观察hashMap的源码可以看到:


kv对存放进来的时候会被封装成Node类型,Node类是一个hashMap封装的内部类


然后调用key的hashcode方法得到哈希码,


将这个hash码传到内置hash()中进行散列运算,得到一个散列值,然后将散列值与数组length进行运算最终得到该Node存放在位置的下标。

20190724171556667.png

20190724171241365.png

20190724171457963.png

20190724171320612.png

观察hashMap的源码可以看到:


kv对存放进来的时候会被封装成Node类型,Node类是一个hashMap封装的内部类


然后调用key的hashcode方法得到哈希码,


将这个hash码传到内置hash()中进行散列运算,得到一个散列值,然后将散列值与数组length进行运算最终得到该Node存放在位置的下标。

注意:

keyhashcode肯定相同,运算出的下标肯定也相同

key不同,hashcode却也可能相同,运算出来的下标可能也相同,

元素放入的顺序,在哈希表中被读出的顺序不一定相同。

目录
相关文章
|
6月前
|
存储 Java
Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
|
7月前
|
存储 NoSQL Java
Redis系列学习文章分享---第二篇(Redis快速入门之Java客户端--Jedis+连接池+SpringDataRedis+RedisTemplate+RedisSerializer+Hash)
Redis系列学习文章分享---第二篇(Redis快速入门之Java客户端--Jedis+连接池+SpringDataRedis+RedisTemplate+RedisSerializer+Hash)
279 0
|
7月前
|
算法 Java
Java中常用hash算法总结
Java中常用hash算法总结
68 0
|
NoSQL Dubbo Java
余额宝团队(Java技术1-4面题目):Hash+二叉树+Redis+线上调优+G1
余额宝一面 1. JVM 内存分哪几个区,每个区的作用是什么?JVM有哪些回收算法,对应的收集器有哪些? 2. GC 的两种判定方法 ?CMS 收集器与 G1 收集器的特点。 3. hashmap源码问题 4. HashMap、HashMap如何保证线程安全、ConcurrentHashMap 5. HashMap底层结构 put操作讲一下 6. GC 的两种判定方法 ?CMS 收集器与 G1 收集器的特点。 7. java线程同步都有哪几种方式,在 Java 中 CycliBarriar 和 CountdownLatch 有什么区别? 8. cas的原理,变量要用哪个关键字修饰,volati
|
索引
java202303java学习笔记第四十三天函数-hash索引结构
java202303java学习笔记第四十三天函数-hash索引结构
55 0
|
存储 缓存 算法
Java数据结构第四讲-树/递归/Hash
Java数据结构第四讲-树/递归/Hash
|
算法 Java API
JAVA中的有序hash
一.hashMap与linkedHashMap 经过两篇文章的讨论,已经可以清楚的知道hashmap利用hash算法将数据均匀分布。这种分布是无序的,即放入顺序和读取顺序不一致。那么JAVA中有没有又是基于hash又是有序的数据结构喃?有!它就是——linkedHashMap。
122 0
|
Java C++ Python
力扣题目-Z字形变幻(数学规律法、hash法,c++,python,Java实现)
力扣题目-Z字形变幻(数学规律法、hash法,c++,python,Java实现)
121 0
|
算法 Java
Java Map的Hash算法究竟干了什么?
Java Map的Hash算法究竟干了什么?
117 0
|
算法 Java
Java中常用hash算法总结
Java中常用hash算法总结
308 0