Java中的Hash Code到底是什么?

时间:2025-04-02 09:36:31

目录

前言

一、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有关的知识的一点分享,喜欢的话不妨点赞留个评论吧!后续会更新图像处理读书笔记,大家可以持续关注哦!