class Value{
int i;
}
public class Equals {
public static void main(String[] args){
Value v1=new Value();
Value v2=new Value();
v1.i=v1.i=100;
System.out.println(v1.equals(v2)); //结果是false
System.out.println(v1==v2); ////结果是false }
}
两个比较的结果都是false。为啥第一个(equals)也是false,谁解释下??
int i;
}
public class Equals {
public static void main(String[] args){
Value v1=new Value();
Value v2=new Value();
v1.i=v1.i=100;
System.out.println(v1.equals(v2)); //结果是false
System.out.println(v1==v2); ////结果是false }
}
两个比较的结果都是false。为啥第一个(equals)也是false,谁解释下??
这一行没看懂
equals和==的区别,你这么记就没错了:
首先数据类型有基本类型和引用类型。
1.当比较的是基本类型数据的时候:equals和==都是拿值比较。
2.当比较的是引用类型数据的时候:==比较的是引用,也就是地址,也有人称句柄,你自己喜欢怎么叫就怎么叫吧;equals比较的是值。
这样就对了
class Value{
int i;
}
public class Equals {
public static void main(String[] args){
Value v1=new Value();
Value v2=new Value();
// v1.i=v1.i=100;
v1=v2;
System.out.println(v1.equals(v2)); //结果是ture
System.out.println(v1==v2); ////结果是TRUE }
}
但是我还是不知道你到底想问什么。。?希望我的回答对你有点帮组!
给你看个我为你写的例子嘛:理解一下
class Value{
int i;
}
public class Equals {
public static void main(String[] args){
String s=new String("abc");
String b=new String("abc");
System.out.println(s==b);
System.out.println(s.equals(b));
String c="abc";
String d="abc";
System.out.println(c==d);
System.out.println(c.equals(d));
}
}
结果:
false
true
true
true
这里面涉及到java的共享机制!具体细节,自己慢慢去看书。
equals()默认的情况下比较的都是引用除非你在自己定义的类中覆盖掉equals方法。
对象和引用大不相同哈,
比如:
Button bb=new Button("asa");
这里的bb指得就是引用,说白了,就是个名字,用这个名字去操纵内存里面的对象块。 new Button()用来创建一个按钮对象并返回该对象的引用,也就是对引用bb的实例化(给其分配内存).其实,引用是放在堆栈里面,而对象则在堆上面创建,在用new创建对象的时候,不但给对象在堆上分配了内存空间,而且也在地址首部创建了一个名字。你暂且把“=”看作赋值,则上面的例子就是把对堆上创建的名字赋给bb.然后用bb去操纵这块内存。再慢慢体会一下。
引用是遥控器,对象是电视机 通俗的说法。把这句话记者就可以了!
而你的Value并没有重写equals, 而是使用系统默认的。 所以就可==相同了。class Value{
int i;
public boolean equals(Object obj){
// 这里面你的自己写上代码才行,我就不替你写了
}
}
将比较运算封装成函数,能得到你想要的那种“等于”
如果结果还不是你想要的,你可以修改equals函数过程,把结果变成你想要的
equals是比较内容,而==表示比较对象(包括内存地址等)
不过有些笔试题喜欢考这个……
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Value other = (Value) obj;
if (this.i != other.i) {
return false;
}
return true;
}
所以你也要重写equals()方法才行
v1.i=v1.i=100; 这一步,只是给v1对象中的i属性付了值,v2中的i属性依旧是个空啊!!
所以后面你不管怎么比较都不会等啊!
如果改成:
v1.i=v2.i=100;
System.out.println(v1.equals(v2)); //结果是true
System.out.println(v1==v2); ////结果是false
不过即使写成那样,答案也是错的...呵呵呵
应该还是要重写equals方法吧!!!
equals比较的是值是否相等 那么你的equals显示false的原因是没覆写equals方法!
http://blog.csdn.net/YidingHe/archive/2009/05/02/4143651.aspx
http://blog.csdn.net/YidingHe/archive/2009/05/02/4143651.aspx Java: equals 和 ==收藏
谈论 equals() 和 hashCode() 的文章太多了,而关于 equals() 和 == 之间的区别,能找到的文章很少。但是搞清楚这点非常重要。如果没搞清楚的话,很容易写出 BUG 而不自知。
二者的区别在于:equals() 方法用于比较两个对象,比较它们的值是否相等;
== 运算符用于比较两个变量,比较它们是否引用到同一个对象。
我们在写 Java 代码的时候,看到的都是变量,而不是对象。对象是我们无法直接访问的,我们只能通过变量来操作对象。变量的值就是对象的引用,所以换句话说:equals() 用来比较两个对象的值,== 用来比较两个变量的值。
(例外情况:当变量被定义为基本型别时,它不会指向对象,它的值就是基本型别的值。这种情况本文不讨论。)
栽在这上面的初学者太多了。
典型的例子就是 String。为什么 String 不能用 == ?因为 String 是对象,只有当 String a 和 String b 指向同一个对象的时候,a == b 才会是 true;否则的话,即使两个 String 对象的值相同,a == b 也会是 false。
而且要注意,当 String a = "a";String b = "a"; 的时候,a 和 b 两个变量指向的就是同一个 String 对象 "a"。这是 Java 为了节省内存做的优化,但却让很多人误以为 String 对象可以用 == 来比较。其实这是错的。
所以,原则上,对象之间的比较都要用 equals() 方法,但有时候我们也可以用 == 来比较对象。例如枚举类,它只允许有那么几个对象,所以可以用 == 来比较。或者我们确实想要知道两个变量是不是指向同一个对象,这时候也应该用 ==。