Java String类中对象的equals方法和自定义类中对象的equals方法有什么区别

Java String类中对象的equals方法和自定义类中对象的equals方法有什么区别,java,Java,我无法理解字符串类中equals方法的行为区别,然后在自定义类中手动重写equals方法 根据java,如果我们希望两个对象相等,那么我们应该重写equals方法来检查它们之间的相等性。所以,我创建了一个Dog类,并覆盖了该类中的equals方法。为了进一步检查对象之间的相等性,我使用了Set type集合,因为它不允许重复。但我很困惑地看到了输出。这是我的密码: import java.util.*; class Dog{ int type; public int getT

我无法理解字符串类中equals方法的行为区别,然后在自定义类中手动重写equals方法

根据java,如果我们希望两个对象相等,那么我们应该重写equals方法来检查它们之间的相等性。所以,我创建了一个Dog类,并覆盖了该类中的equals方法。为了进一步检查对象之间的相等性,我使用了Set type集合,因为它不允许重复。但我很困惑地看到了输出。这是我的密码:

import java.util.*;

class Dog{
    int type;

    public int getType() {
        return type;
    }
    public void setType(int type) {
        this.type = type;
    }

    public boolean equals(Object o){
    if((o instanceof Dog) && ((Dog)o).getType()==this.getType()){
        return true;
    }
    else{
        return false;
    }
}
}
public class CheckEquality {
    public static void main(String[] args) {
        Dog d1=new Dog();
        Dog d2=new Dog();

        d1.setType(12);
        d2.setType(12);
        Set set=new HashSet();
        if(set.add(d1)){
            System.out.println("d1 added");
        }
        if(set.add(d2)){
            System.out.println("d2 added");
        }

        String s1=new String("ad");
        String s2=new String("ad");
        //String s1="ad";
        //String s2="ad";
        Set set2=new HashSet();
        if(set2.add(s1)){
            System.out.println("s1 added");
        }
        if(set2.add(s2)){
            System.out.println("s2 added");
        }

    }
}
输出:

我所期望的是:

有谁能告诉我,当可以看到具有相同类型的对象已经添加到集合中时,为什么会得到d2 addedd语句


相反,String不允许添加语句s2。为什么会这样?。有谁能消除我的疑虑。

因为您还必须重写哈希代码。检查以下各项的合同:

请注意,每当重写hashCode方法时,通常都需要重写该方法,以便维护hashCode方法的一般约定,即相等的对象必须具有相等的哈希代码

将此添加到您的Dog类:

这只是一个基本的例子。如果类型是最终字段,则更好。发件人:

在Java应用程序的执行过程中,每当在同一对象上多次调用hashCode方法时,只要没有修改对象上的equals比较中使用的信息,hashCode方法必须始终返回相同的整数。从应用程序的一次执行到同一应用程序的另一次执行,该整数不必保持一致


因为您还必须重写哈希代码。检查以下各项的合同:

请注意,每当重写hashCode方法时,通常都需要重写该方法,以便维护hashCode方法的一般约定,即相等的对象必须具有相等的哈希代码

将此添加到您的Dog类:

这只是一个基本的例子。如果类型是最终字段,则更好。发件人:

在Java应用程序的执行过程中,每当在同一对象上多次调用hashCode方法时,只要没有修改对象上的equals比较中使用的信息,hashCode方法必须始终返回相同的整数。从应用程序的一次执行到同一应用程序的另一次执行,该整数不必保持一致

你缺少一种方法

其他代码在存储或操作 实例–这些值应均匀分布在不同的情况下 输入,以便在集群中使用。这个属性对我们很重要 哈希表和其他存储数据的数据结构的性能 基于计算出的哈希值的组存储桶中的对象

您可以使用类来生成哈希代码

public class Dog {
    @Override
    public int hashCode() {
        return Objects.hash(type);
    }
}
你缺少一种方法

其他代码在存储或操作 实例–这些值应均匀分布在不同的情况下 输入,以便在集群中使用。这个属性对我们很重要 哈希表和其他存储数据的数据结构的性能 基于计算出的哈希值的组存储桶中的对象

您可以使用类来生成哈希代码

public class Dog {
    @Override
    public int hashCode() {
        return Objects.hash(type);
    }
}
Set实现需要通过使用查找值。您的对象没有提供好的哈希代码,而是使用来自对象的版本。在实现equals时,通常也应该实现hashCode。这只是一种最佳做法

在Java 8中,您可以使用以下代码提供良好且高效的哈希:

Objects.hash(value1, value2, value3);
如果使用得当,哈希集将按预期工作。对于简单的Dog类,可以返回类型,但是对于包含更多属性的更复杂的对象,建议使用objects.hash或类似的方法。

集合实现需要使用查找值。您的对象没有提供好的哈希代码,而是使用来自对象的版本。在实现equals时,通常也应该实现hashCode。这只是一种最佳做法

在Java 8中,您可以使用以下代码提供良好且高效的哈希:

Objects.hash(value1, value2, value3);

如果使用得当,哈希集将按预期工作。对于简单的Dog类,可以返回类型,但是对于包含更多属性的更复杂的对象,建议使用objects.hash或类似方法。

如果不重写hashcode方法,则在hashset中存储对象时会出现冲突问题。Hashset在内部使用hashtable来创建键和值对

由于必须重写hashcode,以便hashset找到相同的hashcode,因此它将在内部调用equals方法

@Override
public int hashCode() {
    return type.hashcode();
}

若不重写hashcode方法,则在hashset中存储对象时会出现冲突问题。Hashset在内部使用hashtable键和v键 值对

由于必须重写hashcode,以便hashset找到相同的hashcode,因此它将在内部调用equals方法

@Override
public int hashCode() {
    return type.hashcode();
}