“==”是java运算符中关系运算符中的一种,主要用于比较“==”两边的操作数是否相等。而equals()方法是一个方法,其返回值为boolean类型,该方法是Object()类中的方法之一。其返回true或者false主要取决于重写实现。最常见的一个例子就是String字符串的比较,不同情况下的字符串“==”与“equals()”返回结果不同。equals()方法最重要的一点就是编程人员能够根据自己的需求去重写该方法,按照自己定义的规则判断两个对象是否相等。
一、使用“==”比较的有两种基本情况,一种是基础数据类型的比较(java中基础数据类型有8种:byte、short、int、long、double、float、boolean、char):这种情况比较的是两个值是否相等。例:
int i=1;
int j=1;
System.out.println(i==j);
输出结果为true。另一种为引用间的比较,比较的是两个对象的地址,如果两个引用指向同一个对象,则返回值为true。否则为false。例如,创建一个Person类,比较p1与p2:
Person p1=new Person();
Person p2=new Person();
System.out.println(p1==p2);
输出结果为false。由于p1与p2为指向Person对象的地址,不相同,所以输出结果为false。
二、equals追根溯源,是Object类中的一个方法,在该类中,equals()实现的也仅仅只是比较两个对象的内存地址是否相等。例如在第二个例子当中将p1==p2改为p1.equals(p2),其结果也为false(Person类中未重写equals方法的情况下)。
但在一些子类中,如:String、Integer 等,该方法将被重写。
在String类中equals()方法重写为将字符串转化为字符数组,比较两个字符数组间的每个字符是否相同,所以当String对象调用equals()方法时,其比较的是两个字符串的内容是否相同,而不是指向字符串的地址。
下面将举例说明,在开始这个例子之前,我们需要知道JVM处理String的一些特性。Java的虚拟机在处理String时会在内存中开辟出一块单独的区域,用来存储字符串对象,这块内存区域被称为字符串缓冲池。当使用String a = "abc";这样的语句进行定义一个引用的时候,首先会在字符串缓冲池中查找是否已经相同的对象,如果存在,那么就直接将这个对象的引用返回给a,如果不存在,则需要新建一个值为"abc"的对象,再将新的引用返回a。而String a = newString("abc");这样的语句明确告诉JVM想要产生一个新的String对象,并且值为"abc",于是就在堆内存中的某一个小角落开辟了一个新的String对象。基于这个原理,我们看以下几个例子。
1、以下程序输出结果为:truetrue。因为在str2赋值之前,str1的赋值操作就已经在内存中创建了一个值为"abc"的对象了,然后str2将会与str1指向相同的地址,所以其引用地址为同一地址,在使用“==”时候,返回值也为true。
String str1="abc";
Stringstr2="abc";
System.out.println(str1==str2);
System.out.println(str1.equals(str2));
2、以下程序输出结果为:false true。由于使用了new,所以str2所创建的字符串的对象在堆中新开辟了一块空间,与str1所指的对象不是同一个,所以地址不同,顾用“==”时的返回值为false,而equals()方法比较的是str1与str2所指对象的每个字符是否相等,故输出的结果为true。
String str1="abc";
String str2=newString("abc");
System.out.println(str1==str2);
System.out.println(str1.equals(str2));
附String类中重写的equals()方法代码:
public booleanequals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}