本帖最后由 waterlee 于 2015-4-4 18:29 编辑
1,千古不变的 "=="
Java中,"=="永远在比较两个对象是否是同一个对象:指向同一块内存就是同一个对象。
2,不确定的equals
讨论equals,要带上”类“
我们看到很多帖子会说:“== 比较的是对象,equals 比较的是内容”,老实说,你按照这个说法写代码大都是正确的,但是你的理解并不深刻。
其实,Java中的 equals 作为一个方法,我们是不能脱离了 类 而单独讨论它的。
那么,说到底, equals 方法来自Object类,源码是这样的:
public boolean equals(Object obj)
{
return this == obj;
}
从源码中我们看到了equals和==深远的缘分。
Object类中的equals方法与==功能是一模一样的:比较两个对象是否是同一个对象。
只是,作为Object子类的String类为了符合自身的特质,重写了Object类的equals方法,重写后的效果是:如果两个String对象的值相同,那么调用equals方法返回true,否则返回false。
为什么要这样做:
这是很有道理的,面向对象的思维方式其根源就是想模拟现实生活的逻辑,在现实生活中,我们认为属性完全相同的两个对象就应该是同一个对象(比如String类的值)。
如果不是这样,只用==就好了,为什么还要用equals?
下面给出一个例子:
public class Test
{
public static void main(String[] args)
{
String str1 = "hello";
String str2 = new String("hello");
String str3 = new String("hello");
String str4 = str3;//与str3是同一个对象
System.out.println(str1 == str2);//false,不是同一个对象
System.out.println(str2 == str3);//false,不是同一个对象
System.out.println(str3 == str4);//true,是同一个对象
System.out.println(str1.equals(str2));//true,值(属性)相同
System.out.println(str2.equals(str3));//true,值(属性)相同
A a1 = new A();
A a2 = new A();
System.out.println(a1 == a2);//false,不是同一个对象
System.out.println(a1.equals(a2));//false 因为没有重写equals方法,所以直接调用Object的equals方法(等同于==),所以错误(因为不是同一对象)
}
}
class A
{}
这里涉及到对String类的理解,请看我的另一篇文章:《Java中String类的内存分配》http://bbs.itheima.com/thread-183584-1-1.html
|
|