这个是我总结的,一家之言,欢迎大家批评指正,欢迎留言 。
1.关于==
==是一个运算符,当两个对象用==连接的时候,返回一个布尔类型的值,要么是true,要么是false。它比较的是两个对象在内存中的地址,当一地址样的时候,那么我们就可以说这两个对象是==的。那么在什么情况下,两个对象在内存地址中的才是一样的呢?
其中一种情况是,创建了一个对象test1,然后将test1通过=运算符赋值给另一个对象test2,也就是如下所示:
Test test1=new Test("Java");
Test test2=test1;
System.out.println("测试1:"+(t2==t1));
上面这个代码打印的是
测试1:true
2.equals方法
在Java中所有的类都默认继承自Object类,其他所有的类都是Object类的子类。在Object类中有一个equals方法。也就是说,对于其他所有的类,如果没有重写equals方法,默认继承Object中的equanls.
到Object类中查看equals方法时,发现:
public boolean equals(Object other)
{
if(this.obj==other)
return true;
return false;
}
也就是说再没有重写过equals方法的类中,如果两个对象==,那么这两个对象equals;如果这两个对象equals,那么它们==。==是equals的充要条件。
3.在String、Integer和Date类中的区别
在上述这三个类中,都重写了equals方法。查看String源码可知,只要两个字符串长度相等并且每个字符都相同,那么这两个对象equals。
对于下列代码:
<pre name="code" class="java">String a1="abc";
String b1="abc";
System.out.println("测试点2:"+(a1==b1)“ ”+b1.equals(a1));
String b2=new String("abc");
System.out.println("测试点3:"+(a1==b2)“ ”+b2.equals(a1));
打印的是:
<pre name="code" class="java"> 测试2:true true
测试3:false true
三者彼此equals,大家应该很好理解,根据String类中的equals方法。而为什么a1==b1成立,但是a1==b2却返回false呢?这是因为String a1="abc";执行的是将abc字符串在内存中的地址放到a1区域;String b1="abc";执行的也是将abc字符串在内存中的地址放到b1区域,相当于下面的代码的功能:
String a="abc";
String a1=a;
String b1=a;
所以,a1==b1成立。
而String b2=new String("abc");相当于又创建了一个"abc"的字符串对象,字符串在内存中地址放在了b2区域。所以a1和b2区域存放的是不同的对象的地址。
也就是说,两个对象如果==成立,那么它们equals时一定也成立;而如果两个对象equals成立,但是不一定==成立。==是equals的充分不必要条件。
4.总结
经过上面两个类型的分析,结论是:==要求两个对象的条件更苛刻,两个对象的区域内存放的地址值一定要相同。而equals在原则上则有了一些舍弃。