static void checkString(String A,String B)
{
boolean result1=A.equals(B);
System.out.println(A+".equal("+B+") 结果为:"+result1);
boolean result2=(A==B);
System.out.println(A+"=="+B+" 结果为:"+result2);
}
public static void main(String args[])
{
checkString("ABC","ABC");
checkString(new String("ABC"),"ABC");
checkString(new String("ABC").intern(),"ABC");
}
结果为:
ABC.equal(ABC) 结果为:true
ABC==ABC 结果为:true
ABC.equal(ABC) 结果为:true
ABC==ABC 结果为:false
ABC.equal(ABC) 结果为:true
ABC==ABC 结果为:true
equals比较的是2个对象的值;而“==”是比较2个对象的引用(内存地址);
程序在运行的时候会创建一个字符串缓冲池,当使用 B = "ABC" 这样的表达是创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象,checkString("ABC","ABC");
中,String A ="ABC"先被放到了池中,所以在B被创建的时候,程序找到了具有相同值的 A,将 B 引用 A 所引用的对象"ABC";
第二个
checkString(new String("ABC"),"ABC");
中,使用了 new 操作符,创建一个新的"ABC" Sting对象被创建在内存中。A、B的值相同,但是位置不同,一个在缓冲池中,一个开辟了新的内存地址。
第三个
checkString(new String("ABC").intern(),"ABC");
intern()将开辟新地址的对象又遣返到缓冲池。