目录

前言

一、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到底是什么?相关推荐

  1. Java中的Hash值到底是怎么计算的

    最近被提及Java中HashMap的一些实现及哈希冲突等,不知不觉就想到哈希值到底是怎么计算出来的,正文如下. 结论: 对于String.Integer等类复写了Object中的hashCode方法的 ...

  2. java中的返回值到底有什么用?

    今天看到一个有意思的问题:java中的返回值到底有什么用? 看到了一个高赞回答如下: 你是公司的老总,然后你跟你秘书说,我想要两张的电影票.然后,你秘书去排队买票,最后把两张电影票给你,这两张电影票就 ...

  3. Java中的参数传递,到底是值传递还是引用传递?

    文章内容为转载,转载自公众号Hollis关于我要彻底给你讲清楚,Java就是值传递,不接受争辩的那种! 原文链接:我要彻底给你讲清楚,Java就是值传递,不接受争辩的那种! 知乎回答链接:Java 到 ...

  4. java中hashcode_浅谈Java中的Hash值

    1.Hash值有什么用? HashMap.HashTable.HashSet,所以涉及到使用Hash值进行优化存储的地方,都会用到HashCode.HashCode是Key,这种计算为提高计算的性能. ...

  5. java中的hash值

    1.Hash值有什么用? HashMap.HashTable.HashSet,所以涉及到使用Hash值进行优化存储的地方,都会用到HashCode.HashCode是Key,这种计算为提高计算的性能. ...

  6. Java中的Hash碰撞是什么?该如何解决?

    在Java中,哈希碰撞(Hash Collision)是指不同的输入数据产生了相同的哈希值.哈希函数是将输入映射到固定大小的哈希值的函数,而碰撞指的是两个不同的输入映射到了相同的哈希值. 哈希碰撞可能 ...

  7. Java中的Hash值的计算方式,java哈希算法简单数据类型的具体实现

    最近被提及Java中HashMap的一些实现及哈希冲突等,借鉴了一位老哥的部分解析,比较明白的展示hash算法的应用吧 结论: 对于String.Integer等类复写了Object中的hashCod ...

  8. zxing qr区域判断_如何在Java中使用Zxing和JFreeSVG创建QR Code SVG?

    zxing qr区域判断 在本文中,我们将研究如何使用Zxing QR代码生成库和JFreeSVG库在Java中创建QR Code SVG图像. QR码生成 下面的代码使用Zxing库创建一个表示QR ...

  9. 如何在Java中使用Zxing和JFreeSVG创建QR Code SVG?

    在本文中,我们将研究如何使用Zxing QR代码生成库和JFreeSVG库在Java中创建QR Code SVG图像. QR码生成 下面的代码使用Zxing库创建一个表示QR Code的java.aw ...

最新文章

  1. R语言绘图:28个实用程序包
  2. 网络安全导论课程-windows开启远程
  3. Python:如何仅用递归函数和栈操作逆序一个栈
  4. librtmp分析(发送数据包处理)
  5. 第一篇:服务的注册与发现Eureka(Finchley版本)V2.0_dev
  6. 初学者注意:你需要明白编程的意义所在,否则是学不好编程的!
  7. polycube--基于ebpf/xdp的网络套件(网桥,路由器,nat,负载平衡器,防火墙,DDoS缓解器)
  8. android spi串口调试,PIC入门3,SPI通信和串口调试实验
  9. vue 多点触控手势_涨姿势了!Appium也可以多点触控操作
  10. pr基本剪辑操作/视频导出操作
  11. vue 关于图片和文字的绝对定位 js 动态设置定位
  12. 新颖的自我介绍_新颖一分钟自我介绍4篇
  13. PHP分布式路由算法介绍与实现
  14. 等额本息和等额本金、提前还款
  15. 夺宝奇兵 (优先队列 + 贪心 + 暴力枚举)
  16. node ncc 打包
  17. 如何查看linux进程?
  18. win10快速关机_如何让win10开机默认开启小键盘?
  19. SQL研习录(24)——CHECK约束
  20. what?spring已经解决循环依赖了,为啥还报循环依赖错误?

热门文章

  1. mysql c盘满了 怎么办_C盘满了如何清理
  2. C语言试题111之 s=a+aa+aaa+aaaa+aa...a 的值,其中 a 是一个数字。例如 2+22+222+2222+22222(此时 共有 5 个数相加),几个数相加有键盘控制。
  3. php案例分析百度云_2019中国云手机市场红手指案例分析
  4. seekg(0,ios::beg)不起作用的原因和解决方法
  5. 从零开始手写VIO 第二章 IMU传感器
  6. 网络安全加固的必要性
  7. 三星优化器 适用于绝大部分安卓手机 超级好用!!
  8. 2021年中国海洋大学计算机及电子信息考研成绩分析
  9. Oracle数据库查询表中记录为空,Empty result set fetched
  10. 联想台式电脑重装系统按哪个键?