Java中的所有类都是Object类的子类,所以Java中的任何对象都可以调用Object类的方法。Object类中有一常用方法boolean equals(Object obj),用来比较两个引用类型变量是否指向同一个对象实体,也就是比较引用类型变量在栈中的地址是否相同,而不是其在堆中的内容是否相同。
因此,我认为可以从以下几个方面来比较“==”和“equals”方法:
1.对于基本数据类型,只能用“==”来比较,即比较基本数据类型变量在栈中的内容是否相等;没有定义“equals”方法
例如:
public class TEST{
public static void main(String[] args) {
int a = 5;
int b = 5;
int c = 6;
System.out.println("a==b?:" + (a==b?true:false));//结果显示true
System.out.println("a==c?:" + (a==c?true:false));//结果显示false
}
}
2.对于引用数据类型,“==”和“equals”作用相同,都是比较两个引用类型变量是否指向同一个对象实体,也就是比较引用类型变量在栈中的地址是否相同
例如:
public class TEST{
public static void main(String[] args) {
TEST test1 = new TEST();
TEST test2 = new TEST();
TEST test3 = test1;
System.out.println("test1==test2?:" + (test1==test2?true:false)); //false
System.out.println("test1==test3?:" + (test1==test3?true:false)); //true
System.out.println("test1.equals(test2)?:" + (test1.equals(test2)?true:false)); //false
System.out.println("test1.equals(test3)?:" + (test1.equals(test3)?true:false)); //true
}
}
*特例:
(1).对于字符串类型来说,String类中equals方法被重写,这时它比较的不再是对象在栈中的地址引用是否相同,而是比较地址引用所指向的堆中的内容
public class TEST{
public static void main(String[] args) {
String c1 = new String("123");
String d1 = new String("123");
System.out.println("c1==d1?:"+(c1==d1)); //false
System.out.println("c1.equals(d1)?:"+(c1.equals(d1))); //true
}
}
(2).而对于StringBuffer类,equals方法没有被重写,因此这个方法就来自Object类,于是有如下结果
public class TEST{
public static void main(String[] args){
StringBuffer c2 = new StringBuffer("123");
StringBuffer d2 = new StringBuffer("123");
System.out.println("c2==d2?:"+(c2==d2)); //false
System.out.println("c2.equals(d2)?:"+(c2.equals(d2))); //false
}
}
(3).String类型对象实例直接赋值和new操作符产生的结果在JVM内存分配过程是不同的:
对于对象实例直接赋值String S = "XXX";JVM会先在常量池中找是否已经有一块内存存的是“XXX”,如果有就让栈中的S指向它;如果没有,那就在常量池里为它分配一块存储“XXX”。
对于new操作符String S = new String("XXX");JVM在heap堆内存中产生新的对象,并将栈中的引用指向对应的堆中的地址
因此有如下结果:
public class TEST{
public static void main(String[] args) {
String a = "123";
String b = "123";
System.out.println("a==b?:"+(a==b)); //true
System.out.println("a.equals(b)?:"+(a.equals(b))); //true
}
}
以上只是个人学习思考后的结果,如有不当之处,恳请各位朋友批评指正!谢谢~
——————————————————————————————————————————————————————————————————————————
参考资料: