Java中的"=="的作用是用来判断两个数据是否相等,无论是8种原生数据类型还是引用类型,引用类型相等也就是指两个引用指向同一个对象,Object类中的equals()方法仅仅是反回(this == Object),所以Object的equals()方法仅仅是判断对象是不是同一个对象,而对于那些继承了Object类而又重写了equals()方法的类,比如说String类,那就要依据具体的equals()方法的实现来判断了.
String类特性与创建过程
1 String是常量,其对象一旦创建完毕就无法改变,当使用“+”拼接字符串时,会生成新的String对象,而不是向原有的String对象追加内容,对于java的String来说比软特殊,java中有一个String pool的概念,它是由String这个类单独在栈中维护。
2 采用literal(字面值)方式赋值时(如 Strng str = "strings"),java会查找String Pool(字符串池,由String这个类单独维护)中是否存在"String",如果不存在,则在String Pool中创建一个"strings"对象,然后将String Pool中的这个"strings"对象地址返回来,赋给引用变量str,这样str会指向String Pool中的这个"strings"字符串对象。
3 如果存在,则不创建任对象,直接将String Pool中这个"strings"对象地址返回来,赋给引用。
4 采用 String str = new String("strings")这个方式,首先在String Pool中查找有没有"strings"这个字符串对象,如果有,则不在String Pool中再去创建"strings"这个对象了,直接在heap(堆)中创建一个"strings"字符串对象,然后将堆中这个"strings"对象地址返回来,赋给str引用,导致str指向了堆中创建的这个"strings"字符串对象。
5 如果没有,则首先在String Pool中创建一个"strings"对象,然后再在heap中创建一个"strings"对象,然后将椎中这个"strings"对象的地址返回来,赋给str引用,导致str指向了堆中所创建的这个"strings"对象。参见java.lang.String.intern()方法。
了解了这些就来猜猜下面的例子吧
public class StringTest { public static void main(String[] args) { String str3 = "abc"; //采的字面什的方式 String str4 = "abc"; //不会创建新的对象 System.out.println(str3 == str4); System.out.println(str3 == "abc".intern()); System.out.println("-----------------------------------"); String str = new String("java"); String str2 = new String("java"); //会创建新的对象 System.out.println(str == str2); System.out.println("-----------------------------------"); String str5 = new String("strings"); String str6 = "string"; System.out.println(str5 == str6); System.out.println("-----------------------------------"); //下面的一些是java语言规范,各种java虚拟机都要如此的实现 String s = "hello"; String s1 = "hel"; String s2 = "lo"; System.out.println(s == s1 + s2); System.out.println(s == "hel" + "lo"); System.out.println(s == s1 + "lo"); } }