目录
前言
一、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 ; // import HashMap class
import ; // 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中有如下有用的方法:
- (6,"hexagon")用于添加元素
- (3)用于获取key对应的value
- ()用于删掉所有元素
- (1)用于删去一个特定key所在的元素
- ()用于检查hashmap是否为空
- ()用于返回HashMap的大小
以下是HashMap的一个具体应用
import ; //importing the HashMap class import ; // 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 Values (4,"square"); // add square at key 4 (3,"triangle"); // add triangle at key 3 (6,"hexagon"); // add hexagon at key 6 (8,"octagon"); // add octagon at key 8 (5,"pentagon"); // add pentagon at key 5 (shapes); // print keys and mapped values (3); // removing value at key 3 (5); // removing value at key 5 ("Updated map:"); (shapes); // prints keys and mapped values (4,"rhombus"); // replaces value at key 4 with rhombus ("Updated map:"); (shapes); // prints keys and mapped values ("Size of map is "+()); (); // removes all key/value pairs in the HashMap ("Updated map:"); (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((b)){
("Equal variables:");
(() + "\n" + ());
}
String c = "10";
String d = "50";
if(!(d)){
("\nUn-equal variables:");
(() + "\n" + ());
}
}
}
总结
以上就是Java中hashcode有关的知识的一点分享,喜欢的话不妨点赞留个评论吧!后续会更新图像处理读书笔记,大家可以持续关注哦!