Java中的String背後的故事

Java中的String背後的故事

String類

String類又稱作不可變字符序列,位於java.lang包中,Java程序默認導入java.lang包下的所有類。Java字符串就是Unicode字符序列,例如字符串“Java”就是4個Unicode字符’J’、’a’、’v’、’a’組成的。
(注:字符串效果上是char[]字符數組,但底層原理是byte[]字節數組)
Java沒有內置的字符串類型,而是在標準Java類庫中提供了一個預定義的類String,每個用雙引號括起來的字符串都是String類的一個實例。

String的實例化非常簡單,直接雙引號創界或者new String對象即可。

String str = "滑技工廠";
String str2 = new String("滑技工廠");

字符串是常量(final類),他們的值在確定後不能更改!!
(注:字符串拼接不叫更改字符串的值,拼接的本質是創建了新的字符串對象。String對象一旦被創建就是固定不變的了,對String對象的任何改變都不影響到原對象,相關的任何change操作都會生成新的對象
在這裏插入圖片描述

字符串拼接

字符串之間通過加號**+**拼接,符號"+“把兩個字符串按給定的順序連接在一起,並且是完全按照給定的形式。當”+"運算符兩側的操作數中只要有一個是字符串(String)類型,系統會自動將另一個操作數轉換爲字符串然後再進行連接。

int age = 18;
String str = "age is" + age;  //str賦值爲"age is 18"
//這種特性通常被用在輸出語句中:
System.out.println("age  is" + age);

常量池

常量池分爲三類:

  1. 全局字符串常量池(String Pool)

    全局字符串常量池中存放的內容是在類加載完成後存到String Pool中的,在每個VM中只有一份,存放的是字符串常量的引用值(在堆中生成字符串對象實例)。

  2. class文件常量池(Class Constant Pool)

    class常量池是在編譯的時候每個class都有的,在編譯階段,存放的是常量(文本字符串、final常量等)和符號引用。

  3. 運行時常量池(Runtime Constant Pool)

    運行時常量池是在類加載完成之後,將每個class常量池中的符號引用值轉存到運行時常量池中,也就是說,每個class都有一個運行時常量池,類在解析之後,將符號引用替換成直接引用,與全局常量池中的引用值保持一致。

在這裏我們不深入討論後兩種。

每當我們創建一個字符串對象時,首先就會檢查字符串常量池中是否存在面值相等的字符串,如果有,則不再創建,直接返回字符串常量池中對該對象的引用;若沒有,則創建然後放入到字符串常量池中並且返回新建對象的引用。
(也就是說,只要出現雙引號""字符串,就一定會在字符串常量池中創建一個字符串對象)

先上代碼(注:對於基本數據類型,==是數值的比較;對於引用數據類型,==是地址值的比較。)

       	String str1 = "滑技工廠";
        String str2 = "滑技工廠";
        String str3 = new String("滑技工廠");
        String str4 = str3.intern();

        System.out.println(str1==str2);
        System.out.println(str1==str3);
        System.out.println(str2==str3);
        System.out.println(str4==str3);
        System.out.println(str4==str1);

運行結果:
在這裏插入圖片描述
爲什麼會出現這樣的情形的?以下分析
以str1爲例,創建str1存於棧中(堆棧知識在這裏不展開),str1會查找字符串常量池中是否存在字符串**“滑技工廠”**,若存在,則str1引用其地址;若不存在,則先在字符串常量池中創建該字符串對象,然後引用其地址。
str2同理,因此str2與str1是同一個地址引用。

在這裏插入圖片描述
str3:在常量池中查找是否有“滑技工廠”對象,有則返回對應的引用實例,沒有則創建對應的實例對象。然後在堆中new一個String(“滑技工廠”)的對象,最後str3引用堆中的這個字符串對象。
因此str3與str1、str2的地址不同,返回false。

在這裏插入圖片描述
str4是在運行的時候調用intern()函數,返回String Pool中“滑技工廠”的引用值,如果沒有就將str3的引用值添加進去。

綜上所述,呈現了這個結果。
在這裏插入圖片描述
因此,字符串的比較通常用str1.equals(str2)來進行,這個是字符串值的比較。
在這裏插入圖片描述
腦闊痛,如果有幫助就給個贊👍吧!!

在這裏插入圖片描述

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