不积跬步,无以至千里;不积小流,无以成江海。
Java语言基础
Java的 == 和equals方法
对于==,比较的是值是否相等
如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
如果作用于引用类型的变量,则比较的是所指向的对象的地址。
对于equals方法,注意:equals方法不能作用于基本数据类型的变量,equals继承Object类,比较的是是否是同一个对象
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
诸如String、Date等类对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是比较内容的。
博客借鉴:https://www.cnblogs.com/smart-hwt/p/8257469.html
一起学Java(二十五)----- == 和equals方法
原文:https://www.cnblogs.com/smilexuezi/p/12056505.html