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

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
			}
		}


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

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

参考资料:

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

2.java中equals和==的区别

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

4.java中String内存分配问题



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值