equals 方法(是String类从它的超类Object中继承的)被用来检测两个对象是否相等,即两个对象的内容是否相等.
==用于比较引用和比较基本数据类型时具有不同的功能:
比较基本数据类型,如果两个值相同,则结果为true.而在比较引用时,如果引用指向内存中的同一对象,结果为true.
基本上按上面的理解就行了,但是楼主给出的例子有点特殊,可能就把你弄混淆了.
例子中的变量全是引用类型,所以==用于比较引用是否指向同一内存中的对象.
例子中的s1中的"Java"是字符串常量,在编译期就被确定了,这样在常量池中就有了"Java"这个常量.
而s2中的"Ja"和"va"也都是字符串常量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量,所以s2在编译期就被解析为一个字符串常量,s2="Java".但是这个时候,常量池中已经存在"Java"这个字符串了,那么s2就指向常量池中的"Java",所以s2也是常量池中"Java"的一个引用.则s1==s2为true就好理解了.
s1还是常量池中"Java"的引用,而str3为str1和str2两个变量得来的,所以无法在编译期确定str3的值,因此str3是运行时创建的新对象"Java"的引用,str3并不是常量池中"Java"的引用,所以s1==str3为false也不难理解了.
equals用来判断两个对象的内容是否相等,所以s1.equals(str3)为true也顺理成章. |