Java - JavaSE - String | StringBuffer

Posted 学习趁早

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java - JavaSE - String | StringBuffer相关的知识,希望对你有一定的参考价值。

String 类

正则表达式

Pattern 类
s.matches();
s.replaceFirst();
s.replaceAll();
s.split();

StringBuffer

文档说明

根据 StringBuffer 的文档说明可知:

StringBuffer 是线程安全的,主要体现在它的方法上有 synchronized 同步锁,也因此导致其执行效率较低。

StringBuffer 虽然是线程安全的,但是其安全指的是操作上的安全,需要处理的数据在处理过程中不能改变,或者处理的数据不被其他线程共享。也就是处理的数据中途自身发生改变,则得到的结果可能和想要的结果不一致,这种不一致并不是因为线程不安全,而是数据自身的不稳定。

StringBuffer 主要有两个常用方法,append() 和 insert()。

容量问题,如果不超过则不会扩容,超过容量自动扩容。

传入的参数不能是 null,否则会报出 NullPointException。

JDK 5 加入了 StringBuilder,它适用于单线程,且操作相同,由于没有加入 synchronized 同步机制,使得它能更快完成任务,官方优先推荐使用。

StringBuffer 初始化容量

public StringBuffer() {
    super(16);
}

public StringBuffer(int capacity) {
    super(capacity);
}

public StringBuffer(String str) {
    super(str.length() + 16);
    append(str);
}

public StringBuffer(CharSequence seq) {
    this(seq.length() + 16);
    append(seq);
}

由构造方法的源码可知,有三种初始化容量:

  1. 无参,容量为 16.
  2. 传入容量值.
  3. 传入 String 或 实现 CharSequence 接口的类型的数据长度 + 16.

StringBuffer 扩容

StringBuffer 在使用 append() 方法时会扩容,策略有两种:

  1. 先将当前容量 * 2,再加 2.

  2. 如果此时容量还比追加后的 StringBuffer 长度 minCapacity 小,则使用minCapacity.

  3. 此时的容量仍需要判断是否超出 StringBuffer 规定的最大容量,如果超过则可能报出 OutOfMemoryError 异常.

    注:可能 是因为 StringBuffer 规定的最大容量和 Integer.MAX_VALUE 仍有 8 个空位.

/*
AbstractStringBuilder.java
StringBuffer 调用的 append() 方法中调用了父类的这个方法
*/
private int newCapacity(int minCapacity) {
    // overflow-conscious code
    int newCapacity = (value.length << 1) + 2;
    if (newCapacity - minCapacity < 0) {
        newCapacity = minCapacity;
    }
    return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)
        ? hugeCapacity(minCapacity)
        : newCapacity;
}

private int hugeCapacity(int minCapacity) {
    if (Integer.MAX_VALUE - minCapacity < 0) { // overflow
        throw new OutOfMemoryError();
    }
    return (minCapacity > MAX_ARRAY_SIZE)
        ? minCapacity : MAX_ARRAY_SIZE;
}

private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
/*
Integer.java
*/
@Native public static final int MAX_VALUE = 0x7fffffff;

为了避免频繁扩容影响运行效率,可以提前设定好 StringBuffer 的容量。

以上是关于Java - JavaSE - String | StringBuffer的主要内容,如果未能解决你的问题,请参考以下文章

JavaSE入门学习27:Java常用类之String类(上)

JavaSE入门学习28:Java常用类之String类(下)

Java全栈JavaSE:17.常用类之Object类String类StringBuilder类

JavaSE编程基础面试题

JavaSe: String的编译期优化

005期JavaSE面试题:String类