当前位置: 技术问答>java相关
还没有入门 在线等待???
来源: 互联网 发布时间:2015-09-19
本文导语: 1。 public class Equivalence { public static void main(String[] args) { Integer n1 = new Integer(47); Integer n2 = new Integer(47); System.out.println(n1 == n2); } } 2。 class Value { int i; } public class EqualsMethod...
1。
public class Equivalence {
public static void main(String[] args) {
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1 == n2);
}
}
2。
class Value {
int i;
}
public class EqualsMethod2 {
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));
}
}
1中,结果为 false
2中结果为false
为什么???
public class Equivalence {
public static void main(String[] args) {
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1 == n2);
}
}
2。
class Value {
int i;
}
public class EqualsMethod2 {
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));
}
}
1中,结果为 false
2中结果为false
为什么???
|
THINKING IN JAVA 里解释的很清楚啦。
第一是新建了两个INT对象。使用的是封装器,==比较的是对象句柄。两个对象即使值一样,但却是两个独立对象。自然输出false。
第二仍然是两个不同对象,equals比较的是对象的实际内容。所以尽管进行了赋值操作 ,但实际上V1,V2的对象内容还是不同的。只是V1.i与v2.i的内容相同而已。你打印出来就知道了。
System.out.println(V1)
System.out.println(V2)
System.out.println(V1.i)
System.out.println(V2.i)
第一是新建了两个INT对象。使用的是封装器,==比较的是对象句柄。两个对象即使值一样,但却是两个独立对象。自然输出false。
第二仍然是两个不同对象,equals比较的是对象的实际内容。所以尽管进行了赋值操作 ,但实际上V1,V2的对象内容还是不同的。只是V1.i与v2.i的内容相同而已。你打印出来就知道了。
System.out.println(V1)
System.out.println(V2)
System.out.println(V1.i)
System.out.println(V2.i)
|
如果是基本数据类型(primary data type),如int,boolean,long等,使用==作为比较操作符是可以的,这和c/c++类似
对于类的对象,用==比较的是两个对象名是否是代表着同一个object。有点c/c++中比较对象指针/句柄的感觉。
1中,n1、n2代表的是两个不同的Integer对象,自然是false
2中,我觉得应该是true啊。
对于类的对象,用==比较的是两个对象名是否是代表着同一个object。有点c/c++中比较对象指针/句柄的感觉。
1中,n1、n2代表的是两个不同的Integer对象,自然是false
2中,我觉得应该是true啊。
|
倒,没看清,那个Value类没有重载equals函数啊,不是true不是true,脸红。
|
System.out.println(n1 == n2);
比的是n1,n2对象的地址
应该用n1.equals(n2)
第二个问题,Java是但根继承结构,所有的非primitive类,都extends于Object,反编译你的类Value,你就知道了。所以Value就继承了Object的equals方法,但是这个方法还没有被你重载,这是 JDK 源代码 Object 的equals实现如下:
public boolean equals(Object obj) {
return (this == obj);
}
父类Object还不能很清楚你要如何比较,所以,他只判断地址是否相同
所以你要自己重载Value类的equals方法
试试下面的代码,就搞定了
class Value {
int i;
public boolean equals(Object obj) {
return (this.i == ((Value)obj).i);
}
}
public class EqualsMethod2 {
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));
}
}
比的是n1,n2对象的地址
应该用n1.equals(n2)
第二个问题,Java是但根继承结构,所有的非primitive类,都extends于Object,反编译你的类Value,你就知道了。所以Value就继承了Object的equals方法,但是这个方法还没有被你重载,这是 JDK 源代码 Object 的equals实现如下:
public boolean equals(Object obj) {
return (this == obj);
}
父类Object还不能很清楚你要如何比较,所以,他只判断地址是否相同
所以你要自己重载Value类的equals方法
试试下面的代码,就搞定了
class Value {
int i;
public boolean equals(Object obj) {
return (this.i == ((Value)obj).i);
}
}
public class EqualsMethod2 {
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));
}
}
|
chenyuan_tongji(codeguru) 不用脸红,我那次看错了,才没面子呢
哈哈哈
哈哈哈