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内存分配问题
- Java基础面试题:==和equals方法有何区别?
- "=="和equals方法究竟有什么区别? —— Java经典面试题系列
- java基础面试题之老题新解:"==" 和 "equals()"方法的区别
- Java面试题之==和equals的区别
- Java面试题—equals和==的区别
- 面试题之java基础:equals()和hashCode()区别?
- java中equals与== 有何区别?
- java基础问题----"=="和equals方法究竟有什么区别
- 【JAVA基础小问题】"=="和equals方法有什么区别?
- Java基础——"=="和equals方法究竟有什么区别?
- Java基础之==和equals方法究竟有什么区别?
- java基础 3、"=="和equals方法有什么区别
- JAVA中“==”和“equals”方法有什么区别
- java中“==”和equals方法有什么区别
- 一个jquery的面试题(find()和filter方法有何区别)
- 07.(java基础)面试题04 ==,equals区别
- java基础之“==” 和equals()方法的区别
- Java基础回顾: "=="和equals()方法的区别
- 背包精讲之——01背包
- 小小编程之我见(2)---jsp页面如何对进行所查询出的结果再分页
- 魔兽哈希算法
- 【甘道夫】Hive0.13.1图形界面HWI尝鲜
- arm linux 启动之一:汇编启动到start_kernel
- Java基础面试题:==和equals方法有何区别?
- C#导出非托管方法供C/C++调用
- 曲洪亮说下自己,同时也说下自己的一个项目
- 将SQLite移植到ARM上
- 系统安全领域的人员是否真的供不应求?
- windows基础应用程序编程(七)鼠标消息
- SQLite3的API简单应用
- Windows/Unix/Linux编译C/C++添加头文件与库的搜索路径
- Android 环境配置过程