String 类
String 是一个 final 类,表示一个不可变的字符串。
String 对象的字符内容是存储在一个字符数组 value[]
中的。
- String 实现了三个接口:
- Serializable 接口:表示字符串是可序列化的。
- Comparable 接口:字符串可以比较大小。
- CharSequence 接口:字符串实际上是字符数组序列。
1 | public final class String |
字符串存储结构
实例化字符串
当字符串以字面量(直接赋值)的方式声明一个字符串时,字符串常量直接存储在常量池中。
当以 new 的方式声明一个字符串时,字符串中非常量对象存储在堆中,对象中的 value 数组指向常量池。
String str1 = "abc";
与 String str2 = new String("abc");
的内存存储区别如下:
1 | String s1 = "abc"; |
字符串拼接
字符串拼接时:
- 常量与常量的拼接,结果在常量池中。
- 只要其中有一个是变量,结果就在堆中(相当于 new 一个 String 对象)。
- String 的 intern 方法返回常量池中的字符串。
1 | String s1 = "Hello"; |
StringBuffer 和 StringBuilder
StringBuffer 类
java.lang.StringBuffer 代表可变的字符序列。
构造器
StringBuffer 对象创建必须使用构造器,有三个构造器:
- StringBuffer():初始容量为 16 的字符串缓冲区。
- StringBuffer(int size):构造指定容量的字符串缓冲区。
- StringBuffer(String str):将内容初始化为指定字符串内容,底层数组为字符串长度+16。
扩容
当添加的元素底层数组存放不下,就需要扩容。
- 默认情况下,扩容为原来的 2 倍 + 2。
- 若容量还是不够,将拼接后的长度当作扩容容量。
1 | private int newCapacity(int minCapacity) { |
StringBuilder 类
StringBuilder 也代表可变的字符序列,而且与 StringBuffer 提供的相关方法一样。
对比 String、StringBuffer、StringBuilder:
- String(JDK 1.0):不可变字符序列。
- StringBuffer(JDK 1.0):可变字符序列,效率低、线程安全。
- StringBuilder(JDK 5.0):可变字符序列,效率高、线程不安全。