String、StringBuffer和StringBuilder之间的区别

    科技2022-07-16  116

    String public final class String implements Serializable, Comparable<String>, CharSequence { private final char[] value; private int hash; private static final long serialVersionUID = -6849794470754667710L; private static final ObjectStreamField[] serialPersistentFields = new ObjectStreamField[0]; public static final Comparator<String> CASE_INSENSITIVE_ORDER = new String.CaseInsensitiveComparator(); AbstractStringBuilder abstract class AbstractStringBuilder implements Appendable, CharSequence { char[] value; int count; private static final int MAX_ARRAY_SIZE = 2147483639; AbstractStringBuilder() { } AbstractStringBuilder(int var1) { this.value = new char[var1]; } StringBuilder public final class StringBuilder extends AbstractStringBuilder implements Serializable, CharSequence { static final long serialVersionUID = 4383685877147921099L; public StringBuilder() { super(16); } StringBuffer public final class StringBuffer extends AbstractStringBuilder implements Serializable, CharSequence { private transient char[] toStringCache; static final long serialVersionUID = 3388685877147921107L; private static final ObjectStreamField[] serialPersistentFields; public StringBuffer() { super(16); }

    1 相同点

    1.1 StringBuffer 和 StringBuilder 都继承了 AbstractStringBuilder 实现了CharSequence

    1.2 String,StringBuffer,StringBuilder 的底层都是用char[ ] 数组实现

    1.3 StringBuffer,StringBuilder 字符数组的初始值为16,扩容为2n+2(n为原数组长度)

    2 不同点

    2.1 String 的底层是final修饰的不可变数组,修改String时实际上是new一个新String对象返回,而StringBuffer和StringBuilder都是可变数组

    StringBuffer:线程安全(StringBuffer中的方法中加synchronized锁),修改值时实际上是修改底层的char数组

    StringBuilder:非线程安全的(StringBuilder中的方法中没加synchronized锁),修改值时实际上是修改底层的char数组

    StringBuffer和StringBuilder 都是继承AbstractStringBuilder, 在其中的大多数操作字符数组的方法都是直接调用父类的方法,区别在于StringBuffer的方法是同步方法(加了synchronize关键字)而StringBuilder并没有加上synchronized 关键字

    Processed: 0.009, SQL: 8