嗨,大家好,欢迎来到程序猿漠然公众号,我是漠然。
在Java编程中,equals()
和hashCode()
这两个方法如同对象的“双胞胎”,总是成对出现。它们决定了对象在集合中的“身份”和“地位”。今天,我们就来深入解析这两个方法的奥秘,以及如何正确地使用它们。
equals()
方法是用来判断两个对象是否“相等”的。在Java中,“相等”意味着两个对象的内容完全一致,而不仅仅是它们的内存地址相同。?使用规范:
x.equals(x)
必须返回true
。x.equals(y)
返回true
,则y.equals(x)
也必须返回true
。x.equals(y)
和y.equals(z)
都返回true
,则x.equals(z)
也必须返回true
。x.equals(y)
应该总是返回相同的值。null
的引用值x
,x.equals(null)
必须返回false
。hashCode()
方法是用来生成对象的哈希码的,这是一个整数。在Java中,很多数据结构如HashSet、HashMap等都依赖哈希码来快速查找对象。?使用规范:
equals()
方法返回true
,它们必须具有相同的哈希码。equals()
方法返回false
,它们可以具有相同的哈希码。让我们以String
类为例,来分析其equals()
和hashCode()
方法的实现:
@Override
public?boolean?equals(Object?obj)?{
????if?(this?==?obj)?{
????????return?true;
????}
????if?(obj?==?null?||?getClass()?!=?obj.getClass())?{
????????return?false;
????}
????String?other?=?(String)?obj;
????int?n?=?value.length;
????if?(n?==?other.value.length)?{
????????for?(int?i?=?0;?i?<?n;?i++)?{
????????????if?(value[i]?!=?other.value[i])?{
????????????????return?false;
????????????}
????????}
????????return?true;
????}
????return?false;
}
@Override
public?int?hashCode()?{
????int?hash?=?0;
????for?(int?i?=?0;?i?<?value.length;?i++)?{
????????hash?=?31?*?hash?+?value[i];
????}
????return?hash;
}
在上述代码中,String
类的equals()
方法首先判断两个对象是否为同一个实例,然后比较长度和每个字符。而hashCode()
方法则是根据字符串的每个字符计算哈希码。
假设我们有一个Person
类,它有两个属性:name
和age
。我们要判断两个Person
对象是否是同一个人,不仅要看他们的name
和age
是否一样,还要看他们的“身份证号”是否一样。所以,我们重写了equals()
和hashCode()
方法,让它们根据Person
的name
和age
来判断相等性和给出“身份证号”。
public?class?Person?{
????private?String?name;
????private?int?age;
????@Override
????public?boolean?equals(Object?obj)?{
????????if?(this?==?obj)?{
????????????return?true;
????????}
????????if?(obj?==?null?||?getClass()?!=?obj.getClass())?{
????????????return?false;
????????}
????????Person?other?=?(Person)?obj;
????????return?age?==?other.age?&&?name.equals(other.name);
????}
????@Override
????public?int?hashCode()?{
????????int?hash?=?7;
????????hash?=?31?*?hash?+?name.hashCode();
????????hash?=?31?*?hash?+?age;
????????return?hash;
????}
}
在这个例子中,我们首先判断两个Person
对象是否为同一个实例,然后比较它们的name
和age
。如果它们都相同,那么这两个Person
对象就是相等的。同时,我们根据name
和age
计算哈希码,以便在集合中快速找到对应的Person
对象。
在Java编程中,正确使用equals()
和hashCode()
方法至关重要。我们需要根据业务逻辑重写这两个方法,并遵循上述规范。只有这样,我们才能保证对象的身份证系统正常运行,避免出现数据结构混乱和异常。记住,当你在Java的海洋中航行时,equals()
和hashCode()
就是你的指南针,没有它们,你可能会在茫茫代码中迷失方向。
今天的分享就到这里,如果觉得对你有帮助,感谢点赞、分享、关注一波,你的认可是我创造的最大动力。
更多内容请关注公众号:程序猿漠然,一个分享有趣后端知识的公众号。