天天看點

String,StringBuilder,StringBuffer差別,竟有這麼多不同

String,StringBuilder,StringBuffer差別,竟有這麼多不同

🍁 作者:知識淺談,CSDN部落格專家,阿裡雲簽約部落客,InfoQ簽約部落客,華為雲雲享專家

📌 擅長領域:全棧工程師、爬蟲、ACM算法

💒 公衆号:知識淺談

從源代碼看String,StringBuilder,StringBuffer差別

🤞這次以JDK1.8的版本,Jdk1.8以上底層數組采用了byte🤞

正菜來了⛳⛳⛳

🎈差別一:安全相關

  • String 和 StringBuilder是線程不安全的;
  • StringBuffer是線程安全的。

為何?

因為StringBuffer在append,delete,等等方法上加了synchronized鎖,是以就是線程安全的。

這裡拿出底層實作的幾個方法:

@Override
    public synchronized int length() {
        return count;
    }
    @Override
    public synchronized int capacity() {
        return value.length;
    }
    @Override
    public synchronized void ensureCapacity(int minimumCapacity) {
        super.ensureCapacity(minimumCapacity);
    }
    @Override
    public synchronized void trimToSize() {
        super.trimToSize();
    }      

🎈差別二:動态數組相關

  • String 不可動态擴容;
  • StringBuilder和StringBuffer可以動态擴容。

🏹String底層使用的是final修飾的常量數組是以其大小是不可變的。

private final char value[];      

🏹StringBuilder和StringBuffer是可變的

原因:因為StringBuilder和StringBuffer都是繼承了抽象類AbstractStringBuilder

AbstractStringBuilder内部使用的是字元數組非常量,也就是可變的。

char[] value;      

初始化的時候預設的長度為16。

🎈拓展:單線程下的StringBuilder

🍚總結