在刚接触Java的时候,经常出现用==来判断String是否相等,却判断不出想要的结果,而是只能用equals。当初的懵懵懂懂,后来不断的实践看理论再实践在看理论,终于理解了到底是怎么回事。Java的基础还是要扎实,特别是这种小知识点,虽然很微不足道,但是写代码过程中还是影响挺大滴。
==判断
Java中有8种基本数据类型,当使用==来判断基本类型变量(且都是数值类型)是否相等时,只需要两个变量的值相等,==就会返回true。但是当判断两个引用类型变量时,只有当它们指向同一个对象时,==才会返回true。
public class Main {
public static void main(String[] args) {
int i = 5;
float f = 5f;
double d = 5.0;
System.out.println(i == f);
System.out.println(i == d);
System.out.println(f == d);
String str1 = new String("fiala");
String str2 = new String("fiala");
System.out.println(str1 == str2);
String str3 = "fiala";
String str4 = "fiala";
System.out.println(str3 == str4);
}
}
上面的程序执行结果是true true true false true。对于基本变量比较时,只要他们的值相等,对数据类型没有严格的要求,==都会返回true。但是对于str1和str2,因为它们两个分别是new出来的String引用变量,虽然这两个引用变量指向的对象存储的内容相同,但是==还是认为它们是两个对象,所以会直接返回false。
对于str1-4四个对象,之所以==判断的结果不同,是因为它们在内存中存储不同。str1和str2在编译前是无法确定值的,所以它们会在堆内存中生成两个对象,在栈中会有两个引用指向堆中的两个对象。str3和str4在编译前就确定了值,所以会存入静态数据区,str3和str4都会指向静态数据区同一个字符串对象。
equals判断
equals()方法是Object类提供的一个判断是否相等的方法,因此引用变量判断是否相等时可以调用该方法。Object的equals()方法和==的判断规则差不多,即引用变量指向同一个对象时才会返回true,equals方法本身的实现也是==。
public boolean equals(Object obj) {
return (this == obj);
}
有的时候判断两个字符串对象是否相等,不需要是相同对象,只需要是存储内容相同就判定为相同,所以String类重写了equals方法,实现了当两个String比较时,即使不是同一个方法,只要存储的字符串相等就返回为true。其实也不止是String类的,其他对象比较时可能也会需要类似功能。
public boolean equals(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;
}
通过重写equals方法可以改变判定对象相等的规则,如果equals方法直接返回true,那可能就闹笑话了,因为任何类型都相等,这是不可能的,所以重写equals方法还是要慎重的,根据自己的需要进行。