== 和 equals

先直接问您们一个问题:

package cn.nuist.pers.day1;

public class Strlng {
public static void main(String[] args) {
	String s1 = "nb";
	String s2 = "nb";
	
	System.out.println(s1 == s2);
	System.out.println(s1.equals(s2));
}
}

输出结果是什么呢?

观众老爷:mdzz,这么简单的问题问我们?当然都是true啊!

啪啪啪!(厉害)

再问您们一个问题:

package cn.nuist.pers.day1;

public class Strlng {
public static void main(String[] args) {
	String s1 = new String("bn"); 
	String s2 = new String("bn"); 
	
	System.out.print(s1 == s2);
	System.out.println(s1.equals(s2));
}
}

这次呢?

观众老爷:false   true

好了,你们可以下山了!!!

我还是向您们好好学习一下这其中的原由吧!

第一道程序:

        当程序运行时会自动产生一个常量池,在运行到 String s1 = “nb”时,会在常量池中查找是否有“nb”这个字符串,若没有则创建一个字符串“nb”,若有(别急,我马上讲);当运行到String  s2 = "nb"时,会在常量池中查找是否有"nb"这个字符串,若没有,则创建;若是有,则用s2引用这个字符串!

        所以,s1,s2都是对"nb"这个字符串的引用,既然是引用,则s1,s2都是指向"nb"这个字符串,则s1 == s2,s1.equals(s2)。

第二道程序:

        用new String创建的字符串不是常量,所以他们不放在常量池中,他们有自己的内存地址空间。即s1,s2是两个不同的对象的引用,当调用==时,结果为false;当调用equals()时,结果为true。

那么,==和equals()的区别和用法是什么呢?

       是这样的(不谈常量),==比较的是两个对象是否是相同对象;而equals()?equals()分重写后和未重写两种情况,像我们一般在生活中遇到的equals()方法,一般都是重写过后的,所以用她来比较两个对象的时候就是比较两个对象的内容是否相同;而未重写equals()的极少数情况,equals()的底层则是调用的==,即比较两个对象是否是相同的对象!(这种情况是日常生活中不常见的情况!)

猜你喜欢

转载自blog.csdn.net/a_cherry_blossoms/article/details/79822611