程序如下:
package dierzhang;
class Value{
int i;
}
public class EqualsMethods {
public static void main(String[] args){
Value v1 = new Value();
Value v2 = new Value();
v1.i = v2.i = 100;
System.out.println(v1.equals(v2));
}
}为什么输出结果是 false?请各位高手解释一下。
package dierzhang;
class Value{
int i;
}
public class EqualsMethods {
public static void main(String[] args){
Value v1 = new Value();
Value v2 = new Value();
v1.i = v2.i = 100;
System.out.println(v1.equals(v2));
}
}为什么输出结果是 false?请各位高手解释一下。
public boolean equals(Object obj) {
return (this == obj);
}这是Object类里面的方法,如果你没有覆写的话那么他调用的是这个,即:比较的是两个对象的地址;
Value v1 = new Value();
Value v2 = new Value();
这两个对象的地址当然是不一样的。虽然Value对象里面的值是一样的,但是比较的并非是里面的值,而是这两个对象在内存中的地址,所以就是false咯
System.out.println(v2.hashCode());
String v2 = new String("1");
if(v1.equals(v2))
{
System.out.println("equals");
}
if(v1==v2)
{
System.out.println("==");
}
打印equals
String v2 = "1";
if(v1.equals(v2))
{
System.out.println("equals");
}
if(v1==v2)
{
System.out.println("==");
}
打印equals ==
int i;
@Override
public int hashCode() {
return this.i;
} @Override
public boolean equals(Object v) {
if (this==v) return true;
if (!(v instanceof Value)) return false;
return this.i==((Value)v).i;
}
}
栈 堆
譬如v1的地址是0x001 100
v2的地址是0x002 100
equals 判断栈地址不一样 你把equals换成==判断的就是堆中的值 结果就是true
此句代码比较的是两个对象的堆内存地址。
在声明及实例化对象的时候,两个对象会在堆内存空间引用两个不同的地址,而以上代码正是比较两个对象的堆内存地址,因此,地址肯定是不同的,为false!
第二:如果你想根据成员变量i比较两个对象,必须重写equals方法;
public boolean equals(Object obj) {
Value o = (Value)obj;
if(this.i == o.i){
return true;
}
return false;
}
你每new一次 它就会在对内存分配一个新的内存,所以比较后返回的会是false
前面的的String是Java给的 不用override equals