String StringBuffer StringBuilder
String
先看看下面这个代码!!
public class Test { public static void main(String[] args) { String string ="a"; String string2="a"; System.out.println(string==string2); String s=new String("a"); String s2=new String("a"); System.out.println(s==s2); } }

String类被final修饰, char 数组被 final修饰 。
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[];
---- 省略掉大量代码
String的值是不可改变的!!!!
StringBuilder 和 StringBuffer的值是可变的。
(这是因为 两者的底层的 char[ ]都没有被final修饰,其实两者的底层是同一个 都是 AbstractStringBuilder类 )

1)StringBuffer 是线程安全的,方法被 synchronized修饰 StringBuilder不是线程安全的!
2)toString()方法不同。 StringBuffer有一个char[]类型的缓冲区,直接根据这个构造String对象 StringBuilder需要复制char[]类型的元素来构造String对象
StringBuffer类中的方法:
@Override public synchronized String toString() { if (toStringCache == null) { /// 这有什么用???? toStringCache = Arrays.copyOfRange(value, 0, count); } return new String(toStringCache, true); }
StringBuilder类的方法:
@Override public String toString() { // Create a copy, don't share the array return new String(value, 0, count); }
在String方法中就看到这两者的差别了:
String(char[] value, boolean share) { // assert share : "unshared not supported"; this.value = value; }
public String(char value[], int offset, int count) { if (offset < 0) { throw new StringIndexOutOfBoundsException(offset); } if (count <= 0) { if (count < 0) { throw new StringIndexOutOfBoundsException(count); } if (offset <= value.length) { this.value = "".value; return; } } // Note: offset or count might be near -1>>>1. if (offset > value.length - count) { throw new StringIndexOutOfBoundsException(offset + count); } this.value = Arrays.copyOfRange(value, offset, offset+count); }
String的 + ,其实就是 调用的 StringBuilder类!!!调用了它的 append 方法,然后又调用了toString()方法。
public class Test { public static void main(String[] args) { String sa = "ab"; String sb = "cd"; String sab=sa+sb; String s="abcd"; System.out.println(sab==s); } }

String string = "ab"; // 创建了一个对象
String string2= new String("cd"); // 创建了两个对象
String String3="x"+"y"' // 创建了三个对象
参考文档:
https://segmentfault.com/a/1190000017909550
https://blog.csdn.net/itchuxuezhe_yang/article/details/89966303
也许会有遗憾,但是不应该在失败之前
浙公网安备 33010602011771号