[Java][String]从hascode()方法降到hash()方法

目录

hashcode() 

1.定义:

2.定位:

3.代码:

4.思考

2.Objects.hash()

5.解决办法

写这篇文章是为了整理一下最近遇到的问题:

hashcode() 

1.定义:

可以简单理解为传入不同的成员变量,返回一个哈希值(也可以成为散列码),通过散列的方式可以快速找到一个对象的具体位置.

主要用在对象的哈希处理和数据结构如哈希表(HashMap、HashSet等)中。`hashCode()` 方法是Object类的一个成员,它返回一个整数值,这个值代表了对象的哈希码,也称为散列码或指纹。这个哈希码通常用于快速查找和区分对象,因为不同的对象通常会有不同的哈希码。

2.定位:

hashcode()是在Object.toString()里会用到的方法

当打印对象名的时候会自动调用Object.toString()方法,代码我给大家看一下:


class Person{
    String name;
    int age;
    Person(String name, int age){
        this.name = name;
        this.age = age;
    }

}

public class Test {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person p = new Person("张三", 20);
        System.out.println(p);
        System.out.println(p.toString());
    }

}

运行结果是这样的。 

之所以会打印出以上内容,因为Object.toString()方法的源代码是这样的:

3.代码:

hashCode的源代码长这个样子,它是一个本地代码,用C++写的,怎么样很抽象对吧。

4.思考

既然:hashcode()可以简单理解为传入不同的成员变量,返回一个哈希值(也可以成为散列码),通过散列的方式可以快速找到一个对象的具体位置.

那么我们是否可以认为两个年龄相同,姓名不同的对象将存储在同一个位置?


class Person{
    String name;
    int age;
    Person(String name, int age){
        this.name = name;
        this.age = age;
    }

}

public class Test {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person p1 = new Person("张三", 20);
        Person p2 = new Person("张三", 20);
        System.out.println(p1.toString().hashCode());
        System.out.println(p2.toString().hashCode());

    }

}

运行结果如下:

注意!两个对象的hash值都不一样!

经过问百度发现原因是:

hashCodehash方法的区别主要在于它们的计算依据不同。

hashCode是基于整个对象的,而hash方法是基于传入的参数的。

就算这两个对象里面的成员变量都是相同的,但是这两个对象地址是不同的,占有不同的内存空间,因此他俩的hashCode()的返回值并不相同

  • hashCode():是对象的方法,返回对象的哈希码。默认情况下,基于对象的内存地址计算。如果重写了 hashCode() 方法,可以基于对象的内容(如成员变量)计算。

  • Objects.hash():是 Objects 类中的静态方法,用于根据一组参数计算哈希值。通常用于在重写 hashCode() 方法时,根据对象的成员变量计算哈希值。

2.Objects.hash()

5.解决办法

hashcode()源代码里面有写解决办法,就是像重写equals方法一样可以重写hashcode()。

为了让不同的对象所产生的hashCode值相同,我们需要重写hashCode方法。

用这种方法可以确定不同对象里面的成员变量是否相同。

重写后的需要用到hash方法,因为hash方法的参数并没有对象的地址,只有成员变量。

重写代码如下:

import java.util.Objects;

class Person{
    String name;
    int age;
    Person(String name, int age){
        this.name = name;
        this.age = age;
    }

    public int hashCode(){
        return Objects.hash(name, age);
    }

}

public class Test {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person p1 = new Person("张三", 20);
        Person p2 = new Person("张三", 20);
        System.out.println(p1.toString().hashCode());
        System.out.println(p2.toString().hashCode());

    }

}

运行后截图:

综上,如果大家有不同的地方可以发评论区,我弄懂了一定解答。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值