Java 为什么这个.equals()代码示例返回“false”?
为什么这是错误的?如果在Java中,默认情况下所有对象都不相等,即使它们具有相同的值,那么我如何说服Java这两个对象实际上是相等的呢?好吧,即使两只狗有相同的名字,身高,体重,一只可能是斑点狗,另一只可能是斗牛犬,即使它们是同一个种族,在本质上,它们总是可以彼此不同Java 为什么这个.equals()代码示例返回“false”?,java,equals,Java,Equals,为什么这是错误的?如果在Java中,默认情况下所有对象都不相等,即使它们具有相同的值,那么我如何说服Java这两个对象实际上是相等的呢?好吧,即使两只狗有相同的名字,身高,体重,一只可能是斑点狗,另一只可能是斗牛犬,即使它们是同一个种族,在本质上,它们总是可以彼此不同 PS:我理解如果一==二{}我们是在比较它们是否都引用堆上的同一个对象,如果它们具有相同顺序的相同字符,.equals on string的比较。默认情况下,equals方法会说这是内存中的同一个对象吗?除非你覆盖它 你没有覆盖它
PS:我理解如果一==二{}我们是在比较它们是否都引用堆上的同一个对象,如果它们具有相同顺序的相同字符,.equals on string的比较。默认情况下,equals方法会说这是内存中的同一个对象吗?除非你覆盖它 你没有覆盖它 行为没有改变 您将需要添加这样的新方法
class Dog{
int height;
int weight;
String name;
}
public class DogTest {
public static void main(String[] args) {
Dog one = new Dog();
one.height=4;
one.name="fudo";
one.weight =2;
Dog two = new Dog();
two.height=4;
two.name="fudo";
two.weight =2;
if (one.equals(two)){
System.out.println("True");
}
else{
System.out.println("False");
}
}
}
Stephan提出了一个很好的观点——如果没有hashCode,永远、永远、永远的implement等于。始终在这两个字段中使用相同的字段
public boolean equals(Object o) {
if(o instanceof Dog) {
Dog d = (Dog)(o);
Dog t = this;
return t.height == d.height && t.weight == d.weight && t.name.equals(d.name);
}
return false;
}
默认情况下,equals方法会说这是内存中的同一个对象吗?除非你覆盖它 你没有覆盖它 行为没有改变 您将需要添加这样的新方法
class Dog{
int height;
int weight;
String name;
}
public class DogTest {
public static void main(String[] args) {
Dog one = new Dog();
one.height=4;
one.name="fudo";
one.weight =2;
Dog two = new Dog();
two.height=4;
two.name="fudo";
two.weight =2;
if (one.equals(two)){
System.out.println("True");
}
else{
System.out.println("False");
}
}
}
Stephan提出了一个很好的观点——如果没有hashCode,永远、永远、永远的implement等于。始终在这两个字段中使用相同的字段
public boolean equals(Object o) {
if(o instanceof Dog) {
Dog d = (Dog)(o);
Dog t = this;
return t.height == d.height && t.weight == d.weight && t.name.equals(d.name);
}
return false;
}
您必须在Dog类中重写equals方法。如果不是,您只是比较这些对象是否是内存中的同一实例 下面是如何执行此操作的实现:
public int hashCode() {
int hash = name.hashCode();
hash = hash * 31 + weight;
hash = hash * 31 + height;
return hash;
}
您必须在Dog类中重写equals方法。如果不是,您只是比较这些对象是否是内存中的同一实例 下面是如何执行此操作的实现:
public int hashCode() {
int hash = name.hashCode();
hash = hash * 31 + weight;
hash = hash * 31 + height;
return hash;
}
任何Ide都允许您自动生成hashcode和equals作为getter和setter 在没有hashcode和equals的情况下,您将得到false,因为对象不能位于同一内存位置 您的工作示例如下:
class Dog{
int height;
int weight;
String name;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Dog)) return false;
Dog dog = (Dog) o;
if (height != dog.height) return false;
if (weight != dog.weight) return false;
return name != null ? name.equals(dog.name) : dog.name == null;
}
}
结果:
要在eclipse中自动生成hashcode和equals,请执行以下操作:
在类中单击鼠标右键,然后:
任何Ide都允许您自动生成hashcode和equals作为getter和setter 在没有hashcode和equals的情况下,您将得到false,因为对象不能位于同一内存位置 您的工作示例如下:
class Dog{
int height;
int weight;
String name;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Dog)) return false;
Dog dog = (Dog) o;
if (height != dog.height) return false;
if (weight != dog.weight) return false;
return name != null ? name.equals(dog.name) : dog.name == null;
}
}
结果:
要在eclipse中自动生成hashcode和equals,请执行以下操作:
在类中单击鼠标右键,然后:
如果你不超越平等,我将很难工作…@Harald,这是不一样的。这就是为什么有些字符串==适用于而其他字符串不适用的原因。如果你不重写equals…@Harald这是不一样的。这就是为什么有些字符串==适用于而其他字符串不适用的原因。别忘了也重写hashCode方法。@Stephan 1000%是。否则,Hashmaps将完全失效!别忘了重写hashCode方法。@Stephan 1000%是。否则,Hashmaps将完全失效!我模模糊糊地理解你想说什么,但我还不理解这个代码实现。无论如何,谢谢你!我没有写任何代码行,我让eclipse帮我做,不管怎样,当你调用'one.equals2',你调用的是覆盖的equals,这里是对象1,obj是对象2。谢谢你的解释,现在看起来更清楚了哈哈,你是怎么让eclipse帮你做的?回答为eclipseJust编辑的信息,为了理解hashcode和equals方法的真正用途,请阅读它们是如何使用HashSet的;我模模糊糊地理解你想说什么,但我还不理解这个代码实现。无论如何,谢谢你!我没有写任何代码行,我让eclipse帮我做,不管怎样,当你调用'one.equals2',你调用的是覆盖的equals,这里是对象1,obj是对象2。谢谢你的解释,现在看起来更清楚了哈哈,你是怎么让eclipse帮你做的?回答为eclipseJust编辑的信息,为了理解hashcode和equals方法的真正用途,请阅读它们是如何使用HashSet的;