Java中的字符串(String)的秘密

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");                  }   }  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://127.0.0.1/wyypdj.html