一起学Java(二十五)----- == 和equals方法

不积跬步,无以至千里;不积小流,无以成江海。

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是比较内容的。

博客借鉴:https://www.cnblogs.com/smart-hwt/p/8257469.html

猜你喜欢

转载自www.cnblogs.com/smilexuezi/p/12056505.html
今日推荐