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