不积跬步,无以至千里;不积小流,无以成江海。
Java语言基础
Java的 == 和equals方法
对于==,比较的是值是否相等
如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
如果作用于引用类型的变量,则比较的是所指向的对象的地址。
对于equals方法,注意:equals方法不能作用于基本数据类型的变量,equals继承Object类,比较的是是否是同一个对象
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。
- 使用“==”和“equals()”方法比较字符串时
“==”比较两个变量(对象)在内存中的首地址是否相同;
“equals()”比较字符串中所包含的内容是否相同。
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
System.out.println(s1 == s3);
System.out.println(s1.equals(s3));
}
}
程序输出:
true true false true
注意:如果是StringBuffer的情况
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
StringBuffer str1 = new StringBuffer("a");
StringBuffer str2 = new StringBuffer("a");
System.out.print(str1.equals(str2));
}
}
程序输出:
false
原因:
StringBuffer类中没重新定义equals这个方法,因此这个方法就来自Object类,而Object类中的equals方法是用来比较“地址”的,所以等于false.
- 对于非字符串变量来说
"=="和"equals"方法的作用是相同的都是用来比较其对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象。
class A{
int a = 1;
String str = "abc";
public void eat() {
System.out.println("eating!");
}
}
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
A obj1 = new A();
A obj2 = new A();
System.out.println(obj1 == obj2);
System.out.println(obj1.equals(obj2));
}
}
程序输出:
false false
延伸:
String类中重新定义了equals这个方法,而且比较的是值,而不是地址。
对于基本类型的包装类型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用变量,==是比较地址的,而equals是比较内容的。
浙公网安备 33010602011771号