一. String基本特性
创建方式:
- 字面量方式 “”。该方式会放入字符串常量池。
- new的方式
String类由final修饰,故不可被继承。
1.8及之前底层有private final char 数组存储数据;1.9及以后由private final byte数组存储数据。(StringBuffer和StringBuilder底层也做了同样的调整)。由于成员变量由final修饰,因此字符串对象具有不可变性。
(补充:修饰的是基本数据类型,这个值本身不能修改。修饰的是引用类型,引用的指向不能修改)
二. String Pool
字符串常量池中不会存储内容相同的字符串。
故,intern()在串池中已存在内容相同字符串时,则=返回串池中的对象;若串池中,不存在,则将当前对象放入【jdk1.6是拷贝一份再放入串池】。开发中合理利用intern可以极大的提高空间利用率。
它是一个固定大小的HashTable,JDK8默认长度1009。通过 -XX: StringTableSize可以修改其长度。

jdk7之后,串池被调整到了堆区。(详见堆的笔记)
三. 字符串拼接
字面量与字面量的拼接,通过编译期优化,直接将结果放入串池。
只要有一个字符串变量参与拼接,则底层是通过StringBuilder进行拼接,结果在堆中。
如果拼接符号两边的变量都被final修饰,则会被编译期优化,而不是通过StringBuilder拼接。
String s1 = "abv";
String s2 = "abc";
/**
StringBuilder s = new StringBuilder();
s.append(s1);s.append(s2);
s.toString(); 约等于new String()
**/
String s3 = s1 + s2;// 也是通过StringBuilder
// 效率更高
final String s1 = "ab";
final String s2 = "abc";
String s3 = "ababc"
String s4 = s1 + s2;// 通过编译期优化
s3 == s4; // true
四. new String()
- new String(“ab”)会造几个对象?
首先在堆空间中创建一个内容为ab的对象;其次字面量"ab"会在串池中再造一个内容为ab的对象,
如果串池中已经有了ab,则不会再重复创建。 - new String(“a”) + new String(“b”)会造几个对象?
6个
StringTable两个"a",“b”
StringBuilder三个"a",“b”,“ab”
toString一个 new String(“ab”)

文章详细介绍了Java中String对象的创建方式,包括字面量和new方式,强调了String的不可变性。讨论了StringPool的运作机制,指出intern()方法的作用以及JDK版本对其的影响。此外,文章还探讨了不同拼接方式的效率差异,如字面量拼接、StringBuilder使用等,并提到了final关键字对编译期优化的影响。

被折叠的 条评论
为什么被折叠?



