您的位置:首页 > 编程语言 > Java开发

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

2011-05-03 11:58 344 查看
  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");

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息