程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 【Java基礎】String StringBuffer StringBuilder

【Java基礎】String StringBuffer StringBuilder

編輯:關於JAVA

【Java基礎】String StringBuffer StringBuilder。本站提示廣大學習愛好者:(【Java基礎】String StringBuffer StringBuilder)文章只能為提供參考,不一定能成為您想要的結果。以下是【Java基礎】String StringBuffer StringBuilder正文


  1. String
  • String是不可變的

    • 我們都知道String不是基本數據類型,而是一個對象,並且是final類型的,不可變的。(public final class String)

      查看以下代碼:

      String text = "a";
      text = "b";

      String不是不可變的麼?為什麼可以這樣用?因為text是字符串"a"的引用,即引用是可以變化的,跟對象實例的屬性變化沒有關系。(這裡創建的是兩個String對象)

    • String設計成不可變的原因

      • 字符串常量池是Java方法區中一個特殊的存儲區域,當創建一個String對象時,假如這個字符串已經在常量池中了,就不會創建一個新的對象,而是引用已經存在的對象。++常量池指的是在編譯期被確定,並保存在已編譯的.class文件中的一些數據。它包括了關於類,方法,接口中的常量,也包括字符串常量++

        String text1 = "abc";
        String text2 = "abc"; 

        上面的代碼只會在堆內存中創建一個實際的String對象。如果字符串對象允許改變的話,那麼會導致各種邏輯錯誤,比如改變一個對象會影響到另一個獨立對象。

        棧(stack):主要保存基本數據類型和對象的引用,數據可以共享,速度僅次於寄存器(register),快於堆

        堆(heap):用於存儲對象

      • 安全性,因為字符串是不可變的,所以是線程安全的,同一個字符串實例可以被多個線程共享。這樣便不用因為線程安全問題而使用同步。字符串本身就是線程安全的。

  1. StringBuffer,StringBuilder

    • StringBuffer

      StringBuffer和String一樣都是用來存儲字符串的,只不過他們內部的實現方式不一樣,導致他們所使用的范圍不同,對於StringBuffer,它在處理字符串的時候,如果是進行修改操作,並不會產生一個新的字符串對象。

      StringBuffer的許多方法和String差不多,只不過修改時StringBuffer是修改自身的,而String類則是產生一個新的對象,這是他們最大的區別。

      同時,StringBuffer是不能通過=來進行初始化的,它必須通過構造方法來進行初始化。

    • StringBuilder

      StringBuilder和StringBuffer的不同之處在於StringBuilder是線程不安全的,StringBuffer是線程安全的。

    • String,StringBuffer,StringBuilder區別

  2. 常見面試題

    • 如何比較兩個字符串?使用“==”還是equals()方法?

      • equals()是用來比較兩個值的,==會比較兩個引用
    • String s=new String("abc")創建了幾個對象?

          public String(String original) {
              this.value = original.value;
              this.hash = original.hash;
          }

      上面是String的構造方法,我們在使用new調用了String的構造方法創建了一個對象,並將它的引用賦值給了str變量。
      同時我們注意到,被調用的構造器方法接受的參數也是一個String對象,這個對象正是“abc”,由此我們又要引入另外一種創建String對象的方法的討論 -- 引號內包含文本

    • String字符串與BufferString的傳遞問題

      • 基本數據類型的值傳遞,不改變其值;引用數據類型的值傳遞,改變其值

      • String類雖然是引用數據類型,但是他當作參數傳遞時和基本數據類型是一樣的

        public static void changeString(String str) {
            // 因為str是屬於局部變量,在調用該方法時實際參數s和形式參數str指向同一個字符串對象
            // 但是在方法內部將str又指向了一個新的字符串對象,而此時s還是指向原來的字符串對象
            // changeString方法執行完畢,局部變量str消失,方法內部產生的新的字符串對象稱為垃圾
            // 但是s還是指向原有的字符串對象,並沒有改變
            str += "test";
        }
    • String.intern()

      • 存在於.class文件中的常量池,在運行期被JVM裝載,並且可以擴充。String的intern()方法就是擴充常量池的一個方法;當一個String實例str調用intern()方法時,Java查找常量池中是否有相同unicode的字符串常量,如果有,返回其引用,沒有的話就在常量池中添加一個unicode等於str的字符串並返回它的引用
    • Java中常見的面試題
      

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved