栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java中的Hash Code到底是什么?

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 shapes = new HashMap(); // Create an ArrayList object with string data type
    }
}

在HashMap中有如下有用的方法:

shapes.put(6,"hexagon")用于添加元素shapes.get(3)用于获取key对应的valueshapes.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 shapes = new HashMap(); //create a HashMap with Integer keys and String Values
    shapes.put(4,"square");       // add square at key 4
    shapes.put(3,"triangle");     // add triangle at key 3
    shapes.put(6,"hexagon");      // add hexagon at key 6
    shapes.put(8,"octagon");     // add octagon at key 8
    shapes.put(5,"pentagon");   // add pentagon at key 5

    System.out.println(shapes); // print keys and mapped values

    shapes.remove(3);          // removing value at key 3
    shapes.remove(5);          // removing value at key 5
    System.out.println("Updated map:");  
    System.out.println(shapes); // prints keys and mapped values
    shapes.put(4,"rhombus");     // replaces value at key 4 with rhombus
    System.out.println("Updated map:"); 
    System.out.println(shapes); // prints keys and mapped values
    System.out.println("Size of map is "+shapes.size());
  
    shapes.clear();             // removes all key/value pairs in the HashMap
    System.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有关的知识的一点分享,喜欢的话不妨点赞留个评论吧!后续会更新图像处理读书笔记,大家可以持续关注哦!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/768816.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号