String、StringBuilder和StringBuffer

String

  • String类代表字符串。Java程序中的所有字符串文字(例如"abc" )都被实现为此类的实例。

    字符串不变; 它们的值在创建后不能被更改。 字符串缓冲区支持可变字符串。 因为String对象是不可变的,它们可以被共享。 例如:

    String str = "abc";

    相当于:

    char data[] = {'a', 'b', 'c'}; String str = new String(data);

StringBuilder

  • 一个可变的字符序列。此类提供与StringBuffer的API,但不保证同步。此类设计用作简易替换为StringBuffer在正在使用由单个线程字符串缓冲区的地方(如通常是这种情况)。在可能的情况下,建议使用这个类别优先于StringBuffer ,因为它在大多数实现中将更快

    StringBuilder的主要StringBuilderappendinsert方法,它们是重载的,以便接受任何类型的数据。 每个都有效地将给定的数据转换为字符串,然后将该字符串的字符附加或插入字符串构建器。 append方法始终在构建器的末尾添加这些字符; insert方法将insert添加到指定点。

    例如,如果z引用当前内容为“ start ”的字符串构建器对象,那么方法调用z.append("le")将导致字符串构建器包含“ startle ”,而z.insert(4, "le")会将字符串构建器更改为包含“ starlet ”。

    一般情况下,如果某人是指的一个实例StringBuilder ,则sb.append(x)具有相同的效果sb.insert(sb.length(), x)

    每个字符串构建器都有一个容量。 只要字符串构建器中包含的字符序列的长度不超过容量,则不需要分配新的内部缓冲区。 如果内部缓冲区溢出,则会自动变大。

    StringBuilder的StringBuilder不能安全使用多线程。 如果需要同步, 那么建议使用StringBuffer

    除非另有说明,否则将null参数传递给null中的构造函数或方法将导致抛出NullPointerException

    //空参构造
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.append("lixy");
    System.out.println(stringBuilder);
    //有参构造
    StringBuilder builder = new StringBuilder("haha");
    builder.append("lixy");
    System.out.println(builder);
    //反转内容
    builder.reverse();
    System.out.println(builder);
    //toString
    builder.append(22).append('a').append(true).append("中国");
    String string = builder.toString();
    System.out.println(string);
  • 结果:

    lixy
    hahalixy
    yxilahah
    yxilahah22atrue中国

StringBuffer

  • 线程安全可变的字符序列。字符串缓冲区就像一个String ,但可以修改。在任何时间点,它包含一些特定的字符序列,但可以通过某些方法调用来更改序列的长度和内容。

    字符串缓冲区可以安全地被多个线程使用。 这些方法在必要时进行同步,以便任何特定实例上的所有操作都按照与所涉及的各个线程所执行的方法调用顺序一致的顺序发生。

    StringBuffer的主要StringBufferappendinsert方法,它们被重载以便接受任何类型的数据。 每个都有效地将给定的数据转换为字符串,然后将该字符串的字符附加或插入到字符串缓冲区。 append方法总是在缓冲区的末尾添加这些字符; insert方法将insert添加到指定点。

  • 例如,如果z是指当前内容为"start"的字符串缓冲区对象,那么方法调用z.append("le")将使字符串缓冲区包含"startle" ,而z.insert(4, "le")会将字符串缓冲区更改为包含"starlet"

    一般情况下,如果某人是指的一个实例StringBuffer ,则sb.append(x)具有相同的效果sb.insert(sb.length(), x)

    每当涉及源序列(例如从源序列追加或插入)的操作发生时,该类仅在执行操作的字符串缓冲器上进行同步,而不在源上。 请注意,虽然StringBuffer被设计为可以安全地从多个线程并发使用,但如果构造函数或appendinsert操作被传递通过线程共享的源序列,则调用代码必须确保该操作具有一致且不变的视图在操作期间的源序列。 呼叫者通过使用不可变的源序列,或者不跨线程共享源序列,可以在呼叫期间持有锁来满足这一点。

    每个字符串缓冲区都有一个容量。 只要字符串缓冲区中包含的字符序列的长度不超过容量,就不必分配新的内部缓冲区数组。 如果内部缓冲区溢出,则会自动变大。

    除非另有说明,否则将null参数传递给null中的构造函数或方法将导致抛出NullPointerException

原文地址:https://www.cnblogs.com/lxy522/p/12814531.html