Java中比较两个对象(这里是统称,包括数据和类,下同)是否相等有两种方法,分别是“==”和“equals()”,对于初学者来说可能不知道为什么会有两种方法,下面我们就来看看。另外一点就是“=”在赋值时需要注意的。
1、“==”与“equals()”的区别
一般来说“”与“equals()”时没有区别的,因为在Object类中“equals()”就是用“”来比较的(Object是所有类的父类),但在有些类中“equals()”方法被重写了,这样就有了区别,有的时候这种重写是必要的。
先来看一串代码
String s1="abc";
String s2="abc";
if(s1==s2)
System.out.println("s1==s2");
很显然,程序执行后会输出s1==s2,我们换种写法再试一次
String s1="abc";
String s2=new String("abc");
if(s1==s2)
System.out.println("s1==s2");
if(s1!=s2)
System.out.println("s1!=s2");
if(s1.equals(s2))
System.out.println("s1.equals(s2)");
if(!s1.equals(s2))
System.out.println("!s1.equals(s2)");
这次却输出了s1!=s2,s1.equals(s2),这个结果和我们预期的不太一样。
原因是在程序运行时会创建一个字符串缓冲池,第一次在赋值时程序会在缓冲池中找到“abc”赋值给s1,s2,第二次在赋值时程序也找到“abc”给s1,但s2要一个新的字符串,所以系统找了一个新的“abc”给s2,在用“==”比较时会发现二者不一样,再用“equals()”比较时二者就一样了,这是因为String类重写了“equals()”方法。
2、关于“=”的细节
这个细节不是很重要,了解一下就行。对于基础数据类型,在用“=”赋值时是把实际的值赋给变量,而如果是给数组或者对象等非基础数据类型用"="赋值时是把该对象的地址复制给它,而不是值。