可变字符串StringBuilder&StringBuffer
-
字符串的分类:
- 不可变字符串:String。在地址不变的情况下,字符串不可改变
- 可变字符串:StringBuilder,StringBuffer。地址不变的情况下,想把“ab”变成“abcd”是可能的,直接追加即可
sb.append("cd")
-
区别与联系
- String类是不可变类,即一旦一个String对象被创建后,包含在这个对象中的字符序列是不可改变的,直至这个对象销毁。
- StringBuffer类则代表一个字符序列可变的字符串,可通过
append、insert、reverse、setChartAt、setLength
等方法改变其内容。一旦生成了最终的字符串,调用toString方法将其转变为String
- StringBuffer:JDK1.0开始 效率低 线程安全
- StringBuilder类在JDK1.5新增,与StringBuffer相似,构造方法和方法基本相同。区别在于StringBuffer是线程安全的,而StringBuilder是线程不安全的,所以性能略高。通常情况下,创建一个内容可变的字符串,应该优先考虑使用StringBuilder。将 StringBuilder 的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用 StringBuffer。
- StringBuilder:JDK1.5开始 效率高 线程不安全
-
StringBuffer的主要
StringBuffer
是append
和insert
方法,它们被重载以便接受任何类型的数据。 每个都有效地将给定的数据转换为字符串,然后将该字符串的字符附加或插入到字符串缓冲区。append
方法总是在缓冲区的末尾添加这些字符;insert
方法将insert
添加到指定点。 -
StringBuilder&StringBuffer底层:非常重要的两个属性:
/**该值用于字符存储 * The value is used for character storage. */ char[] value; /**计数是使用的字符数 * The count is the number of characters used. */ int count;
-
每个字符串生成器都有一定的容量。只要字符串生成器所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区。如果内部缓冲区溢出,则此容量自动增大。 字符数组扩容,自动扩容时长度翻倍后加2。
new = old * 2 + 2
,相关源码如下:class AbstractStringBuilder private void ensureCapacityInternal(int minimumCapacity) { // overflow-conscious code if (minimumCapacity - value.length > 0) { value = Arrays.copyOf(value, newCapacity(minimumCapacity)); } } private int newCapacity(int minCapacity) { // overflow-conscious code 左移一位相当于乘2 int newCapacity = (value.length << 1) + 2; if (newCapacity - minCapacity < 0) { <