String源碼粗略解讀

前言

基本上只要是Java程序員,就肯定會接觸過String類。博主我是大三參加藍橋杯比賽才學會用String類的charAt(),length(),toString()等等常用函數。所以今天有時間來看看String的源碼,分析一下我們常用的方法在源碼層面是什麼樣子的。

String類

在這裏插入圖片描述

源碼中String類是用final關鍵字修飾的,表示String類是一個不可變的類。然後String類實現了Serializable、Comparable、CharSequence接口。它們分別有什麼作用呢?

  1. Serializable接口,表示這個類是能夠被序列化的,便於在網絡中傳輸和保存。
  2. Comparable接口,裏面只有一個compareTo方法,這個是用來進行排序的,如果返回-1,則當前對象排在前面;如果返回1,則當前對象排在後面;返回0,則表示相等。
  3. CharSequence接口,裏面就是定義一些常用的方法,如charAt(int),length(),toString()等。

String的定義變量

在這裏插入圖片描述

從構造函數可以看出來,其實String類的底層是char類型的數組。然後String類還會把對應的hash值記錄下來。這就是爲什麼HashMap比較喜歡用String類做爲key的原因。因爲String類會hashcode緩存下來,不用多一步計算它的hash值。

  1. value[]表示是String的底層用的是char類型的數組。
  2. hash表示變量的hash值,用hash來記錄下來。
  3. serialVersionUID表示序列化機制,用來驗證版本的一致性。

equal(Object)方法

在這裏插入圖片描述

String類重寫了equal()方法,因爲Object類原始的equal()方法是“==”。String類的equal()方法就是判斷是不是同一個類型,如果是,則對比它們的長度,如果相等,則對比它們的字符。簡單來說,就是判斷兩個字符串的值是否一樣。

hashCode()方法

在這裏插入圖片描述

String類的hashCode()方法就是hash值乘以31然後加每位的值。然而即使你的hash函數設計得再好,也是會產生hash碰撞。所以一般兩個字符串的hashcode相等並不代表它們相等,還需要判斷它們是否equal()相等纔可以。

toString()方法

在這裏插入圖片描述
在這裏插入圖片描述

toString()用的就是Object類的toString()方法。就是返回一個類名+@+hashCode的16進制的數字的字符串。

intern()方法

在這裏插入圖片描述

String類的intern()方法是native的。就是本地方法,該方法的實現由非Java語言實現,比如C、C++。這個特徵並非Java所持有,很多其它的編程語言都有這一個機制。

intern()方法的用途是當前的字符對象(通過new出來的對象)可以使用intern方法從常量池中獲取,如果常量池中不存在該字符串,那麼就會新建一個新的字符串放到常量池中。

/**
 * @author god-jiang
 * @date 2020/4/15  14:22
 */
public class Main {
    public static void main(String[] args) {
        String str1 = "god-jiang";
        String str2 = new String("god-jiang");
        String str3 = new String("god-jiang").intern();

        System.out.println(str1 == str2); //false
        System.out.println(str1 == str3); //true
    }
}

總結

String類還是有很多常用的函數我沒有全部說到,比如isEmpty(),indexOf(),substring(),concat()等等。我就寫了一些比較淺的源碼解讀,其他的方法也寫得很不錯,如果你們感興趣可以多去看看源碼,這樣可以增加你的知識。

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