黑马程序员技术交流社区

标题: 关于String的常识 [打印本页]

作者: 陈泽鑫    时间: 2012-12-8 16:25
标题: 关于String的常识
本帖最后由 陈泽鑫 于 2012-12-8 17:11 编辑

String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc"  )都作为此类的实例实现。  
字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。例如:  
String str = "abc";  
等效于:
char data[] = {'a', 'b', 'c'};
String str = new String(data);

从概念上讲,Java字符串就是Unicode字符序列。Java没有内置的字符串类型。而是在标准Java类库中提供的一个预定义类String。每个用双引号括起来的字符串都是String类的一个实例:
String e = "";
String greeting = "Hello";

String类没有提供用于修改字符串的方法。因为Java将String类对象称为不可变字符串。当然,可以修改字符串变量greeting,让他引用另外一个字符串,但是如何修改这个字符串呢?可以使用substring()方法提取需要的字符,然后再拼接上替换的字符串:
greeting = greeting.substring(0,3) + "pl";

但是通过拼接创建的新字符串效率不高,不过不可变字符串却有一个优点:编译器可以让字符串共享
具体的工作方式:
公共语言运行时通过维护一个表来存放字符串,该表称为“暂存池”(String Pool),它包含程序中以编程方式声明或创建的每个唯一的字符串的一个引用。 因此,具有特定值的字符串的实例在系统中只有一个。如:
String s1 = "abc";
String s2 = "abc";
s1.hashCode() == s2.hashCode()// true;
将同一字符串分配给几个变量,运行时就会从暂存池中检索对该字符串的相同引用,并将它分配给各个变量。

String类中的intern方法使用暂存池来搜索与 str 值相等的字符串。 如果存在这样的字符串,则返回暂存池中它的引用。 如果不存在,则向暂存池添加对 str 的引用,然后返回该引用。
在下面的示例中,值为“MyTest”的字符串 s1 已被拘留,因为它是程序中的文本。StringBuilder 类生成与 s1 同值的新字符串对象。 对该字符串的引用被分配给 s2。 Intern 方法搜索与 s2 具有相同值的字符串。 由于存在此类字符串,因此该方法返回分配给 s1 的引用。 该引用又被分配给 s3。 引用 s1 和 s2 相比较的结果是不相等,因为它们引用了不同的对象;而引用 s1 和 s3 相比较的结果是相等,因为它们引用了同一字符串。

String s1 = "MyTest";
String s2 = new StringBuilder().append("My").append("Test").toString();
String s3 = String.intern(s2);
System.out.println((Object)s2==(Object)s1); // 不同的引用
System.out.println((Object)s3==(Object)s1); // 相同的引用

作者: HeiMa-黄倲江    时间: 2012-12-8 16:57
菜鸟飘过..




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2