Java--equals()方法、hashCode()方法和toString()方法

本文深入探讨了Java中equals方法与hashCode方法的关系,解释了为何重写equals时必须重写hashCode,以及String类如何实现这两个方法。同时,强调了自定义类中添加toString方法的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果重写 equals 方法,就必须也重写 hashCode 方法

两个对象的 hashCode 一致,那必然用equals方法判定的也是一致的。

equals()

在没有重写 equals() 方法的情况下,他与 == 一样是判断地址是否相同。

object 类的 equals() 的源码:

public boolean equals(Object obj) {
    return (this == obj);
}

而 String 类自己重写了 equals 方法:

String 类中的 equals() 的源码:

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String aString = (String)anObject;
        if (coder() == aString.coder()) {
            return isLatin1() ? StringLatin1.equals(value, aString.value)
                              : StringUTF16.equals(value,  aString.value);
        }
    }
    return false;
}

hashCode()

与 equals() 类似,在 object 类中一样有一个基础的定义,因此每个对象都有一个默认的散列码,其值为对象的存储地址

object 类的 hashCode() 的源码:

@HotSpotIntrinsicCandidate
public native int hashCode();

这里只有一个 native 定义的本地方法并没有方法体,也就是说是由 c++或 c 写的方法来获取存储地址。

而在 String 类中,重写了 hashCode 方法,他的值是根据内容算出来的,并不是地址,所以说我们不能认为 hashCode 就是地址值

String 类的 hashCode() 的源码:

public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            hash = h = isLatin1() ? StringLatin1.hashCode(value)
                                  : StringUTF16.hashCode(value);
        }
        return h;
    }

例子:

public static void main(String[] args) {
		String s = "OK";
		String t = new String("OK");
		System.out.println(s.equals(t));
	}

输出结果为:

true

由源码可知,他们的值一样,所以hashCode一样,则equals返回为真。

toString()

无限推荐为自己定义的每一个类添加toString 方法,这是一个良好的编程习惯!

object 类的 toString() 的源码:

    public String toString() {
        return getClass().getName() + "@" +  Integer.toHexString(hashCode());
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值