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

 

posted @ 2020-08-01 21:41  你眼里的星辰  阅读(97)  评论(0)    收藏  举报