String
大约 3 分钟languagejava
移除emoji
public static String removeNonBmpUnicodes(String str) {
return null == str ? null : str.replaceAll("[^\\u0000-\\uFFFF]", "");
}
StringBuilder,StringBuffer
- String 是 final 修饰的,每次操作会产生新的对象,占用内存相对较多。后面两者都是在原对象上做操作
- StringBuffer 的方法都是 synchronized 修饰的,是线程安全的,StringBuilder 不是线程安全的
- 性能由高到低:StringBuilder > StringBuffer > String
- 经常需要改变字符串内容的话使用后两者。优先使用 StringBuilder,在多线程环境下有共享变量时使用 StringBuffer
三者的区别如下:

- StringBuilder一个可变的字符序列是JDK1.5新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。
- 如果可能,建议优先采用StringBuilder类,因为在大多数实现中,它比 StringBuffer 要快。且两者的方法基本相同。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类
阿里java开发手册
循环体内拼接字符串不要使用 String 的 + ,而要使用 StringBuilder 的 append,因为每次使用 + 拼接字符串时候都会 new 一个 StringBuilder 对象造成内存空间的浪费,图解说明如下: 
产生的后果
当内存中的无引用对象过多了以后, JVM 的 GC 开始工作,那速度是一定会相当慢的。 另外当GC清理速度跟不上new String的速度时,还会导致内存溢出Error,会直接kill掉主程序!报错如下: Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded Exception in thread "I/O dispatcher 3797236" java.lang.OutOfMemoryError: GC overhead limit exceeded
使用总结
- 如果不是在循环体中进行字符串拼接的话,直接使用 String 的 “+” 就好了。
- 单线程循环中操作大量字符串数据 → StringBuilder.append()
- 多线程循环中操作大量字符串数据 → StringBuffer.append() 其实拼接字符串的方式还有很多种,包括String.concat()、String.join("", str1, str2)、StringUtils.join(str1, str2) 等, 但在我们日常开发中最常用的就是 String 的 “+” 和 StringXXX.append()方法啦,只要掌握好这三种方式的使用场景, 就基本能保证代码的高可用性了。好了,这篇文章就到这里,希望能够对你有帮助!
替换指定字符
String str = "hello";
str.replace("ll","");
删除指定 index 字符
// 方法声明
public StringBuffer deleteCharAt(int index)
// 使用案例
package com.yiibai;
import java.lang.*;
public class StringBufferDemo {
public static void main(String[] args) {
StringBuffer buff = new StringBuffer("Java lang package");
System.out.println("buffer = " + buff);
// deleting character from index 4 to index 9
buff.delete(4, 9);
System.out.println("After deletion = " + buff);
buff = new StringBuffer("amit");
System.out.println("buffer = " + buff);
// deleting character at index 2
buff.deleteCharAt(2);
System.out.println("After deletion = " + buff);
}
}
字符串转换为 char 数组

