String、StringBuffer和StringBuilder

一、詳解

  1. String操作詳解
    StringBuilder>StringBuffer>String
    why?
    String:字符串常量
    StringBuffer:字符串變量
    StringBuilder:字符串變量
    從名字分析來看,String是一個常量,也就是它產生之後就不能被改變,那麼等等看看下面的代碼
String s = "hello";
s+="world";
System.out.println(s);//結果爲:"helloworld"

我們不是說String是字符串常量嗎?哪爲甚嗎?它又改變值了呢?下面我們看一下內存圖

首先我們要明確一下:字符串的直接賦值的方式是先到字符串常量池當中去找,如果沒有就創建並返回,如果有就直接返回;字符串的另一個特性就是一旦被賦值就不能被改變;
先說一下上面代碼的執行過程:
a:在棧內存當中執行String s = “hello”的代碼,首先我們要判斷”hello”這個字符串是否存在字符串常量池。
b:如果”hello”不在字符串常量池當中,那麼就創造一個,然後把”hello”的地址給s,賦值給s;
c:當執行s+=”world”;時,由於字符串常量的特點,所以給”world”從新開一個空間。
d:然後在從新開一個空間把兩個串拼接在一起,把地址給s賦值給s;
注意:我們說的字符串一旦創建就不能被改變,不是說的s不能被改變,而是說的”hello”字符串不能被改變
從上面執行過程發現:沒當用String進行操作的時候會創建好幾個對象,所以這特別耗時和浪費空間,而StringBuffer和StringBuilder就不一樣了,他們是字符串變量,是可以改變,所以在進行操作的時候是不用在內存當中新開闢一個空間的,直接調用append()方法在原先的空間後面添加就可以。

二 、面試常問的點

  1. String、StringBuffer和StringBuilder的區別?
    1. String 是內容不可變得,而其他兩者內容是可以改變的;
    2. StringBuffer是同步的,數據安全,效率低;StringBuilder是不同步的,數據不安全,效率高。(以上所的是多線程)
  2. StringBuffer和數組的區別?
    二者都可以看做是一個裝數據的容器,但是呢,StringBuffer是一個字符串數據,而數組可以是任何類型的數據,但是必須是同一類型。
  3. 形式參數問題
    1. String作爲形式參數傳遞,把String當成一個基本數據類型;
    2. StringBuffer作爲形式參數
      1. 基本類型:形式參數的改變不影響實際參數。
      2. 引用類型:形式參數的改變直接影響實際參數。

注意:String作爲形式參數和基本類型一樣,因爲它在內存中的位置不一樣,所以是一個特殊的類

三.尾巴

1.如有錯誤歡迎大家指出,我會及時更正,有什麼不懂也可以留言提問,互相交流嗎。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章