JAVA中String、StringBuilder、StringBuffer解析

一、基础接口/类

1. CharSequence

CharSequence是一个接口,表示char值的一个可读序列。此接口对不同种类的char序列提供统一的只读访问接口。

此接口不修改equals和hashCode方法。

实现类:CharBuffer、String、StringBuilder、StringBuffer

charAt(int): char  //访问
subSequence(int, int): CharSequence //返回子CharSequence
toString(): String
length(): int

2. Appenable

Appenable是一个接口,表示可添加char序列和值。

实现类:StringBuffer、 StringBuilder、BufferedWriter、CharArrayWriter、CharBuffer、 FileWriter等等。

append(CharSequence): Appendable
append(CharSequence, int, int): Appendable
append(char): Appendable

3. AbstractStringBuilder

AbstractStringBuilder是一个抽象类,表示可变的字符序列。

实现了CharSequence和Appenable接口。

数据结构

使用char[]保存当前字符序列,使用int保存当前字符数量。

API

实现了基础的修改字符序列方法。子类仅需实现toString方法。

@Override
public abstract String toString();

二、String

实现了CharSequence接口,为可访问的char序列。

实现了Serializable接口,可以被序列化。

实现了Comparable,支持String之间的相互比较。

1. 数据结构

为字符数组char[],存储字符的unicode值。

2. 特点

  • 不可变

    一旦生成,char[]中数据就不可变。即String内容不变。

  • 重复利用

    当新创建String test = "abc"时,JVM会到String常量池查询是否已经存在内容为“abc”的String对象,如果已经存在该String,则把test设置为这个对象的引用;如果不存在,则新创建一个内容为“abc”的String对象,并加入常量池。

三、StringBuilder

继承自AbstractStringBuilder,实现了Serializable、CharSequence接口。

1. 数据结构

使用父类AbstractStringBuilder中的字符数组。

2. 特点

  • 可变
  • 非线程安全
  • 仅在toString()时生成String对象

3. 实现

实现toString方法。使用StringFactory根据字符数组char[]生成一个新的String对象并返回。

@Override
public String toString() {
    if (count == 0) {
        return "";
    }
    return StringFactory.newStringFromChars(0, count, value);
}

四、 StringBuffer

继承自AbstractStringBuilder,实现了Serializable、CharSequence接口。

1. 数据结构

使用父类AbstractStringBuilder中的字符数组。

2. 特点

  • 线程安全
  • 仅在toString()时生成String对象且在不修改内容的情况下只生成一次。

3. 实现

实现线程安全

public方法添加synchronized同步锁。

实现toString方法

    @Override
    public synchronized String toString() {
        if (toStringCache == null) {
            toStringCache = Arrays.copyOfRange(value, 0, count);
        }
        return new String(toStringCache, 0, count);
    }

五、总结

1.整体框架图

JAVA中String、StringBuilder、StringBuffer解析_第1张图片
08083111-591e2833f8a34264b0dad417f4188e35.jpg

2. 比较

是否可变 是否线程安全
String
StringBuilder
StringBuffer

3.使用场景

可以根据是否需要内容可变/是否运行在多线程环境下,来选择合适的类。

你可能感兴趣的:(JAVA中String、StringBuilder、StringBuffer解析)