Java基础面试题:==和equals方法有何区别?

来源:互联网 发布:最好的sql语句教程 编辑:程序博客网 时间:2024/05/16 10:45

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));//结果显示trueSystem.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));                //falseSystem.out.println("test1==test3?:" + (test1==test3?true:false));                //trueSystem.out.println("test1.equals(test2)?:" + (test1.equals(test2)?true:false));  //falseSystem.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));         //falseSystem.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));        //falseSystem.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));                                //trueSystem.out.println("a.equals(b)?:"+(a.equals(b)));                  //true}}


以上只是个人学习思考后的结果,如有不当之处,恳请各位朋友批评指正!谢谢~

——————————————————————————————————————————————————————————————————————————

参考资料:

1.java中equals方法和“==”的比较

2.java中equals和==的区别

3.Java String类型剖析及其JVM内存分配详解

4.java中String内存分配问题



0 0
原创粉丝点击