Java中的Hash Code到底是什么?
目录
前言
一、Java中的Hashcode是什么?
二、Hash table是什么?
1. 概述
2. hash table的组成
1. Hash function
2. Array
3. 如何处理不同key有相同index的问题(collision)
三、Hashing 是什么?
四、Java中HashMap是什么?
五、hashCode()使用范例
总结
前言
作为Java的初学者,我们总会碰到一些概念上的问题。我最近学习就碰到了一个问题:hashcode是什么?它有什么用?在查阅了众多博文后,我对hashcode有了初步认识,将我所学习到的知识写在这里和大家分享。欢迎关注我,和我共同成长进步。
本文主要参考到的链接有
What is a hash code in Java?
一、Java中的Hashcode是什么?
hash code是一个整数,它和Java中每一个对象(object)关联。使用hash code是为了实现hash tables中的hashing。hash code被数据结构如HashMap下面我们一一来解释hash tables和hashing、HashMap的含义。我们还会介绍Java中hashCode()方法是如何使用的。
二、Hash table是什么?
1. 概述
Hash table是一种数据结构,它里面存储的是键-值对。(key-value)
Key被传送给一个hash函数,hash函数会在key的基础上进行一系列算术操作。结果是键值对在hash table中的索引(index),通常这个结果也被称为hash value或者hash。
2. hash table的组成
基本的hash table由两方面组成
1. Hash function
Hash function决定了我们键值对的索引是什么。
一个有效的hash function决定了hash table的质量。Hash table应该具有如下两个性质:
- 从Hash值中不能得到我们对应的Key
- 不同的key应该对应不同的Hash值
2. Array
Array是hash table中存放所有键值对的方式。Array的大小应该根据我们期望得到的数据量来设定。
3. 如何处理不同key有相同index的问题(collision)
- Linear Probing:如果一个键值对被hash映射到了一个已经被占用的index,它会线性搜索找到表中下一个空的位置。
- Chaining:hash table实际上是一个元素为链表的数组。所有映射到(map)相同index的key会在对应的位置以链表节点的方式存储。
- Resize:顾名思义,当hash table达到一个设定好hash table被占用的百分比的threshold时,hash table就会增大自己的size。于是hash table会有更多的空间来放置index冲突的问题。
三、Hashing 是什么?
Hashing就是形容我们之前提到的将一个给定的key转化成value的过程。我们之前所说的用hash function把key转化成index的过程,就是hashing。一种简单的hashing方式其实是这样子的:
index = key MOD tableSize
上面其实就是一个取模运算,当然能这样hashing的前提是key是数值形式。这样做的好处跟计算机内部计算基本是取模运算是一个原理:避免越界。
事实上,hashing在数字编码中也常被用到。存储密码的形式其实是他们的hashes。这样即使源数据库泄露,真正的密码得益于hashing的one-way属性(从hash value推不出来key)也不会泄露。
四、Java中HashMap是什么?
个人理解HashMap和hashtable差不多。但是网上好像说Java中HashMap和hashtable有一点区别,继承不同。个人的感觉时是HashTable更像是一种理论。Java中的HashMap类通过应用一个hash table实现了map接口。
import java.util.HashMap; // import HashMap class
import java.util.Map; // import Map Interface
class MyClass {public static void main( String args[] ) {HashMap<Integer, String> shapes = new HashMap<Integer,String>(); // Create an ArrayList object with string data type}
}
在HashMap中有如下有用的方法:
- shapes.put(6,"hexagon")用于添加元素
- shapes.get(3)用于获取key对应的value
- shapes.clear()用于删掉所有元素
- shapes.remove(1)用于删去一个特定key所在的元素
- shapes.isEmpty()用于检查hashmap是否为空
- shapes.size()用于返回HashMap的大小
以下是HashMap的一个具体应用
import java.util.HashMap; //importing the HashMap class import java.util.Map; // importing the Map interface class MyClass {public static void main( String args[] ) {HashMap<Integer,String> shapes = new HashMap<Integer,String>(); //create a HashMap with Integer keys and String Valuesshapes.put(4,"square"); // add square at key 4shapes.put(3,"triangle"); // add triangle at key 3shapes.put(6,"hexagon"); // add hexagon at key 6shapes.put(8,"octagon"); // add octagon at key 8shapes.put(5,"pentagon"); // add pentagon at key 5System.out.println(shapes); // print keys and mapped valuesshapes.remove(3); // removing value at key 3shapes.remove(5); // removing value at key 5System.out.println("Updated map:"); System.out.println(shapes); // prints keys and mapped valuesshapes.put(4,"rhombus"); // replaces value at key 4 with rhombusSystem.out.println("Updated map:"); System.out.println(shapes); // prints keys and mapped valuesSystem.out.println("Size of map is "+shapes.size());shapes.clear(); // removes all key/value pairs in the HashMapSystem.out.println("Updated map:"); System.out.println(shapes); // prints keys and mapped values} }
五、hashCode()使用范例
java中,hashCode()这一个方法定义在所有类的默认父类Object中,所以所有自定义的类其实都继承了它。它会返回对象对应hash code的值。
一般情况下,对于相同的对象它会返回相同的整数值。特殊情况下,如果equals()被修改,那么即使是不同的对象,由于equals()值相同,hash code value也是相同的。
以下为一段实例
class Hash{public static void main(String[] args){String a = "200";String b = "200";if(a.equals(b)){System.out.println("Equal variables:");System.out.println(a.hashCode() + "\n" + b.hashCode());}String c = "10";String d = "50";if(!c.equals(d)){System.out.println("\nUn-equal variables:");System.out.println(c.hashCode() + "\n" + d.hashCode());}}
}
总结
以上就是Java中hashcode有关的知识的一点分享,喜欢的话不妨点赞留个评论吧!后续会更新图像处理读书笔记,大家可以持续关注哦!
Java中的Hash Code到底是什么?相关推荐
- Java中的Hash值到底是怎么计算的
最近被提及Java中HashMap的一些实现及哈希冲突等,不知不觉就想到哈希值到底是怎么计算出来的,正文如下. 结论: 对于String.Integer等类复写了Object中的hashCode方法的 ...
- java中的返回值到底有什么用?
今天看到一个有意思的问题:java中的返回值到底有什么用? 看到了一个高赞回答如下: 你是公司的老总,然后你跟你秘书说,我想要两张的电影票.然后,你秘书去排队买票,最后把两张电影票给你,这两张电影票就 ...
- Java中的参数传递,到底是值传递还是引用传递?
文章内容为转载,转载自公众号Hollis关于我要彻底给你讲清楚,Java就是值传递,不接受争辩的那种! 原文链接:我要彻底给你讲清楚,Java就是值传递,不接受争辩的那种! 知乎回答链接:Java 到 ...
- java中hashcode_浅谈Java中的Hash值
1.Hash值有什么用? HashMap.HashTable.HashSet,所以涉及到使用Hash值进行优化存储的地方,都会用到HashCode.HashCode是Key,这种计算为提高计算的性能. ...
- java中的hash值
1.Hash值有什么用? HashMap.HashTable.HashSet,所以涉及到使用Hash值进行优化存储的地方,都会用到HashCode.HashCode是Key,这种计算为提高计算的性能. ...
- Java中的Hash碰撞是什么?该如何解决?
在Java中,哈希碰撞(Hash Collision)是指不同的输入数据产生了相同的哈希值.哈希函数是将输入映射到固定大小的哈希值的函数,而碰撞指的是两个不同的输入映射到了相同的哈希值. 哈希碰撞可能 ...
- Java中的Hash值的计算方式,java哈希算法简单数据类型的具体实现
最近被提及Java中HashMap的一些实现及哈希冲突等,借鉴了一位老哥的部分解析,比较明白的展示hash算法的应用吧 结论: 对于String.Integer等类复写了Object中的hashCod ...
- zxing qr区域判断_如何在Java中使用Zxing和JFreeSVG创建QR Code SVG?
zxing qr区域判断 在本文中,我们将研究如何使用Zxing QR代码生成库和JFreeSVG库在Java中创建QR Code SVG图像. QR码生成 下面的代码使用Zxing库创建一个表示QR ...
- 如何在Java中使用Zxing和JFreeSVG创建QR Code SVG?
在本文中,我们将研究如何使用Zxing QR代码生成库和JFreeSVG库在Java中创建QR Code SVG图像. QR码生成 下面的代码使用Zxing库创建一个表示QR Code的java.aw ...
最新文章
- R语言绘图:28个实用程序包
- 网络安全导论课程-windows开启远程
- Python:如何仅用递归函数和栈操作逆序一个栈
- librtmp分析(发送数据包处理)
- 第一篇:服务的注册与发现Eureka(Finchley版本)V2.0_dev
- 初学者注意:你需要明白编程的意义所在,否则是学不好编程的!
- polycube--基于ebpf/xdp的网络套件(网桥,路由器,nat,负载平衡器,防火墙,DDoS缓解器)
- android spi串口调试,PIC入门3,SPI通信和串口调试实验
- vue 多点触控手势_涨姿势了!Appium也可以多点触控操作
- pr基本剪辑操作/视频导出操作
- vue 关于图片和文字的绝对定位 js 动态设置定位
- 新颖的自我介绍_新颖一分钟自我介绍4篇
- PHP分布式路由算法介绍与实现
- 等额本息和等额本金、提前还款
- 夺宝奇兵 (优先队列 + 贪心 + 暴力枚举)
- node ncc 打包
- 如何查看linux进程?
- win10快速关机_如何让win10开机默认开启小键盘?
- SQL研习录(24)——CHECK约束
- what?spring已经解决循环依赖了,为啥还报循环依赖错误?
热门文章
- mysql c盘满了 怎么办_C盘满了如何清理
- C语言试题111之 s=a+aa+aaa+aaaa+aa...a 的值,其中 a 是一个数字。例如 2+22+222+2222+22222(此时 共有 5 个数相加),几个数相加有键盘控制。
- php案例分析百度云_2019中国云手机市场红手指案例分析
- seekg(0,ios::beg)不起作用的原因和解决方法
- 从零开始手写VIO 第二章 IMU传感器
- 网络安全加固的必要性
- 三星优化器 适用于绝大部分安卓手机 超级好用!!
- 2021年中国海洋大学计算机及电子信息考研成绩分析
- Oracle数据库查询表中记录为空,Empty result set fetched
- 联想台式电脑重装系统按哪个键?