==:是用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。
equals方法在下面不同的情况中有些不同。
一、对于非字符串变量:
==:判断两个对象的地址是否相同
equals:由于所有的类都是继承自java.lang.Object类的。如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法。Object中的equal方法返回的是"=="的判断。因此"=="和"equal"方法的作用是相同的。都是用来比较其对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象。
示例:
public class TestOperator{
public static void main(String[] args){
A obj1 = new A();
A obj2 = new A();
System.out.println("==比较:"+(obj1 == obj2));
System.out.println("equal比较:"+ obj1.equals(obj2));
obj1 = obj2;
System.out.println("==比较:"+(obj1 == obj2));
System.out.println("equal比较:"+ obj1.equals(obj2));
}
}
class A{
}
输出结果:
二、对于字符串变量:
==:判断两个对象的地址是否相同
equals:String类中重新定义了equals这个方法,比较的是值,而不是地址。
示例:
public class TestOperator1{
public static void main(String[] args){
String str1 = new String("str");
String str2 = new String("str");
System.out.println("==比较:" + (str1 == str2));
System.out.println("equal比较:" + str1.equals(str2));
String str3 = "str1";
String str4 = "str1";
System.out.println("==比较:" + (str3 == str4));
System.out.println("equal比较:"+(str3.equals(str4)));
}
}
输出结果:
注意:由于str3和str4是两个字符串常量所生成的变量,其中所存放的内存地址是相等的,所以s3==s4是true
总结:
1.在equals方法没有被重写的情况下,== 和equals的作用是相同的。都是比较变量在内存中的地址。
2.在equals方法重写,例如String中,equals的作用是比较两个变量值,而非地址。==依然比较的是变量在内存中的地址。
参考:http://hi.baidu.com/tp_soon/item/e82449fae3abbe11fe35823b