Java hashCode()和toString()

hashCode主要用于对象在哈希表(如Hashtable,HashMap)中的快速查找,相同的对象其hashCode必须相同。两个对象hashCode相同并不意味着它们相等,而equals相等的对象hashCode必须相同。当equals重写时,hashCode也应该重写。toString方法用于将对象转换为字符串,通常会重写以显示对象的属性信息。文章强调了hashCode在提高查找效率中的角色以及toString在调试和理解对象状态时的重要性。
摘要由CSDN通过智能技术生成

hashCode()

hashCoed 的特性:
(1) HashCode 的存在主要是用于查找的快捷性,如 Hashtable HashMap 等, HashCode 经常用于确定对象的存储地址;
(2)如果两个对象相同, equals 方法一定返回 true ,并且这两个对象的 HashCode 一定相同;
(3)两个对象的 HashCode 相同,并不一定表示两个对象就相同,即 equals() 不一定为 true ,只能够说明这两个对象在一个散列存储结构中。
(4)如果对象的 equals 方法被重写,那么对象的 HashCode 也尽量重写。
面试题:两个对象的 hashCode() 相同,则对象一定相同吗? 不一定
System.out.println("Ma".hashCode());//2484

System.out.println("NB".hashCode());//2484

String s1 = new String("Ma");

String s2 = new String("NB");

System.out.println(s1.hashCode()); //2484

System.out.println(s2.hashCode()); //2484

System.out.println(s1==s2);//false
所以有可能不同的值计算出来的 hashCode() 相同,但是同一个值的 hashCode() 是不会变的,所以 可以根据字符串值推算出它的hashCode(), 但是不能根据 hashCode() 的值推算出字符串的值。
作用

我们平时经常用到map来存储对象,因为map是key,value形式的,它不像list形式的集合可以有顺序的从0开始往集合里放数据,而是随意的放,但是取值的话就很麻烦,因为它存放值的时候没有顺序,所以取值的时候根据key去里面一个一个对比,等找到key相等的值就取出,这样就会造成效率问题。

当我们用到hashCode()可以看到我们将name计算为3373707,age计算为98511,这样的话我们存值的时候就根据计算后的数值进行对应位置的存储,同样当我们get取值的时候再次将key计算为hashCode()值,因为同一个字符串hashCode()值相等,这个时候我们就可以直接根据hashCode()值将对应位置的数据取出,就不需要对key一个一个进行对比了,这样大大提高了效率,这就是为什么有 hashCode()存在的原因了。

toString()

toString() 是 Java 中的一个方法,它用于将对象转换为字符串表示形式。

在 Java 中,每个类都继承了 Object 类,并且 Object 类有一个默认的toString() 方法。该方法的实现返回一个包含类名和对象内存地址的字符串。

public class MyClass {
    private int value;

    public MyClass(int value) {
        this.value = value;
    }

    public static void main(String[] args) {
        MyClass obj = new MyClass(5);
        System.out.println(obj.toString());
    }
}

输出结果为:MyClass@123a439b

然而,通常情况下我们希望将对象的属性信息也包含在 toString() 方法的输出中,以便更好地调试和理解代码。为此,我们可以重写 toString() 方法,根据自己的需求来定义对象的字符串表示形式。

public class MyClass {
    private int value;

    public MyClass(int value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return "MyClass(value=" + value + ")";
    }

    public static void main(String[] args) {
        MyClass obj = new MyClass(5);
        System.out.println(obj.toString());
    }
}

输出结果为:MyClass(value=5)

通过重写 toString() 方法,我们可以自定义对象的字符串表示形式,以便更好地满足我们的需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bridge Fish

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值