目录
- ⛳ StringBuffer and StringBuilder 处理字符串
- 🎨 一,简介
- 🏭 二,常用方法
- 🚜 三 ,`StringBugger`
- 🐾 四,`StringBuilder`
- ⭐ 五,`StringBuffer`和`StringBuilder`面试
⛳ StringBuffer and StringBuilder 处理字符串
当我们处理字符序列是,经常需要进行字符串的拼接,替换,插入和删除等操作。Java提供了两个用于处理可变字符串的类:
StringBuffer
和StringBuilder
。他们都是属于java.lang
包,提供了一系列方法来修改字符串内容。
StringBuffer
和StringBuilder
的作用是相同的,都可以用于构建和修改字符串。他们的区别在于线程安全性和性能。
🎨 一,简介
-
当
append()
和insert()
时,如果原来的value数组长度不够,可扩容。- 扩容原理:
/*** For positive values of {@code minimumCapacity}, this method* behaves like {@code ensureCapacity}, however it is never* synchronized.* If {@code minimumCapacity} is non positive due to numeric* overflow, this method throws {@code OutOfMemoryError}.*/private void ensureCapacityInternal(int minimumCapacity) {// overflow-conscious codeif (minimumCapacity - value.length > 0) {value = Arrays.copyOf(value,newCapacity(minimumCapacity));}}
-
StringBuffer
和StringBuilder
中的方法支持方法链操作-
方法链原理:
@Overridepublic StringBuilder append(String str) {super.append(str);return this;} // return this 返回对象本身
-
🏭 二,常用方法
StringBuffer
和StringBuilder
中的方法都是类似的。
StringBuffer append(xxx)
: 提供了很多的append()
重载方法,用于进行字符串拼接。StringBuffer delete(int start, int end)
:删除指定位置的内容。StringBuffer replace(int start, int end, String str)
:把[start,end)位置替换成为str。StringBuffer insert(int offset, xxx)
:在指定位置插入xxx。StringBuffer reverse()
:把当前字符串序列逆转 。public int indexOf(String str)
:返回指定字符串出现的索引。public String substring(int start, int end)
:用于从字符串中提取子字符串的方法。它返回原始字符串中指定位置范围内的子字符串。public int length()
:返回字符串的长度。public char charAt(int n)
:返回指定索引的字符。public void setCharAt(int n, char ch)
:设置指定索引处的字符。
🚜 三 ,StringBugger
StringBuffer
是线程安全的,适合在多线程环境下使用。由于它的方法是同步的,保证了多个线程同时访问时的数据安全。然而,同步操作会带来一定的性能损失。因此,在单线程环境下,使用StringBuilder
性能更好。
StringBuffer sb = new StringBuffer("Hello");
sb.append(" World");
sb.insert(5, ",");
sb.delete(3, 6);
sb.replace(6, 11, "Java");
System.out.println(sb.toString()); // 输出:Helo, Java
🐾 四,StringBuilder
StringBuilder
是非线程安全的,适合在单线程环境下使用,由于没有同步操作,他的性能比StringBuffer
更高。因此,在单线程环境下,推荐使用StringBuilder
。
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World");
sb.insert(5, ",");
sb.delete(3, 6);
sb.replace(6, 11, "Java");
System.out.println(sb.toString()); // 输出:Helo, Java
⭐ 五,StringBuffer
和StringBuilder
面试
-
StringBuffer
和StringBuilder
非常类似,均代表可变的字符序列,而且提供相关的方法也一样。 -
面试题:对比
String
、StringBuffer
、StringBuilder
-
String
(JDK 1.0):是不可变字符序列final value[]
-
StringBuffer
(JDK 1.0):可变的字符序列、效率低、线程安全 -
StringBuilder
(JDK 5.0):可变字符序列、效率高、线程不安全
-