在实际编程中,经常会使用到==和equals来判断两个变量是否相同。但也有不少人,尤其是java初学者常常会把它们记得乱七八糟,使用起来更是一团糟。以下是我做的一些总结,希望对大家有所帮助,如有错误请大家不吝指出,谢谢!^_^
说明:测试环境:jdk1.6.0
一、==介绍
==运算符比较的是两个变量的值是否相等,以 a==b为例:
(1)如果a,b都是基本数据类型
1、如果a、b不兼容,则不可比较
2、如果a、b兼容,则那么比较的是两个变量在栈内的数值:
int a=1;int b=1;
结果:a==b:true;
(2)如果a为基本数据类型,b为引用数据类型
1、如果a、b不兼容,则不可比较
2、如果a、b兼容,则比较的依然是a、b具体的值:
int a=1;
Integer b=1;
Integer B=new Integer(1);
结果:a==b:true;a==B:true
(3)如果a、b都是引用数据类型
1、如果a、b不兼容,则不可比较
2、如果a、b兼容,则比较的是对象a、b在栈上的地址,而非该地址指向的堆上的具体数值
简单说,就是比较对象a、b是否是同一对象
String a = "abc";
String b = new String("abc");
String B = new String("abc");
结果:a==b:false;
a==B:false;
b==B:false
二、equals介绍
一般情况下,equals比较的是两个对象的内容是否相等,以 a==b为例:
(1)如果a,b都是基本数据类型,不可用
(2)如果a为基本数据类型,b为引用数据类型
1、如果a、b不兼容,则结果必然为false
2、如果a、b兼容,则比较的是a在栈上的数值与b在堆上具体的内容:
int a=1;
Integer b=1;
Integer B=new Integer(1);
结果:b.equals(a):true;
B.equals(a):true
(3)如果a、b都是引用数据类型
1、如果a、b不是同一个类的实例,则结果必然为false
如:Object a=new String("abc");Object b=new StringBuffer("abc");
2、如果a、b是同一个类的实例,则比较的是对象a、b在堆上的具体内容
String a=new String("abc");
String b=new String("abc");
String c=new String("def");
Object B=new String("abc");
结果: a.equals(b):true
a.equals(c):false
a.equals(B):true
c.equals(B):false