跳至主要內容

String

chanchaw大约 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

三者的区别如下:

StringBuilderStringBuffer区别
StringBuilderStringBuffer区别
  1. StringBuilder一个可变的字符序列是JDK1.5新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。
  2. 如果可能,建议优先采用StringBuilder类,因为在大多数实现中,它比 StringBuffer 要快。且两者的方法基本相同。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类

阿里java开发手册

循环体内拼接字符串不要使用 String 的 + ,而要使用 StringBuilder 的 append,因为每次使用 + 拼接字符串时候都会 new 一个 StringBuilder 对象造成内存空间的浪费,图解说明如下: StringBuilderStringBuffer区别01

产生的后果

当内存中的无引用对象过多了以后, 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

使用总结
  1. 如果不是在循环体中进行字符串拼接的话,直接使用 String 的 “+” 就好了。
  2. 单线程循环中操作大量字符串数据 → StringBuilder.append()
  3. 多线程循环中操作大量字符串数据 → 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 数组

字符串转换为char数组
字符串转换为char数组