String原始碼解析

2021-09-14 05:08:41 字數 3222 閱讀 3566

string類被final修飾詞修飾,代表不可修改的特性,它實現了三個介面,serializable是序列化介面,compareble是排序介面,char是字串行介面。

public final class string implements serializable, comparable, charsequence
char:string通過char來實現string的各種功能,字串由字元陣列實現。

hash:用於快取hash值,因為string類是final不可修改的,所以hash值也是固定的,為了避免重複計算hash值而快取。

case_insensitive_order:排序器,由上可知string類實現了compareble介面,這裡的comparator用於忽視大小寫的字串的比較。

private final char value;

private int hash;

public static final comparatorcase_insensitive_order = new string.caseinsensitivecomparator();

string共有15個過載建構函式,入參這幾種:空、char、string、stringbuffer、stringbuilder、byte,通過這些來構造字串物件。

//第一種,入參為空,新建了大小為0的char陣列,這就是空字串

public string()

//第二種,入參為string物件,直接將入參的屬性複製過來

public string(string var1)

//第三種,入參為char,將value賦值為入參var1

public string(char var1)

//第四種,入參為char,擷取char中從var2到var3的字元作為字串

public string(char var1, int var2, int var3) else if (var3 < 0) else if (var2 > var1.length - var3) else

}public string(int var1, int var2, int var3) else if (var3 < 0) else if (var2 > var1.length - var3) else

++var5;}}

char var10 = new char[var5];

var7 = var2;

for(int var8 = 0; var7 < var4; ++var8) else

++var7;

}this.value = var10;}}

/** @deprecated */

@deprecated

public string(byte var1, int var2, int var3, int var4)

} else

}this.value = var5;

}/** @deprecated */

@deprecated

public string(byte var1, int var2)

private static void checkbounds(byte var0, int var1, int var2) else if (var1 < 0) else if (var1 > var0.length - var2)

}public string(byte var1, int var2, int var3, string var4) throws unsupportedencodingexception else

}public string(byte var1, int var2, int var3, charset var4) else

}public string(byte var1, string var2) throws unsupportedencodingexception

public string(byte var1, charset var2)

public string(byte var1, int var2, int var3)

public string(byte var1)

public string(stringbuffer var1)

}public string(stringbuilder var1)

string(char var1, boolean var2)

/** @deprecated */

@deprecated

string(int var1, int var2, char var3)

通過獲取char的長度來獲取字串的長度

public int length()
通過判斷char的長度是否為0來判斷是否為空

public boolean isempty()
通過char陣列下標獲取到對應位置的char字元

public char charat(int var1)  else 

}

首先比較記憶體位址,再判斷是否是string型別,然後再判斷長度,最後逐個比較其中的char。

public boolean equals(object var1)  else 

}return true;}}

return false;

}}

這裡的hash值計算有個特點,就是string內部快取了hash值,如果hash值不為0則直接返回,不需要再次進行計算,因為string是被final修飾的,它不會被修改,所以沒有必要每次都重新計算hash值。

public int hashcode() 

//計算好後將hash值賦值給成員變數hash

this.hash = var1;

}//最後返回hash值

return var1;

}

通過兩個字串的第乙個不一樣的字元來比較大小並返回結果,若兩個字串的字元都一樣則比較兩個字串的長度。

public int compareto(string str) 

}//若兩個字串迴圈比較的字元是一樣的,那麼使用字串長度來比較大小

return thislen - strlen;

}

JDK原始碼解析 String類

equals方法相信大家都比較熟悉和了解了,string的equals方法主要用來比較string物件內容序列的異同,原始碼如下 public boolean equals object anobject 判斷是否是string型別 if anobject instanceof string ret...

String類equals 原始碼逐行解析

上原始碼 基本型別沒有equals方法,因為equals方法的是object的方法,基本型別沒有繼承這個類。基本型別用 比較的是值。而對於類來說,比較的位址,即是不是在同乙個位址的同一物件。在obect類中,equals方法內部比較用的是 但很多類都重寫了這個方法,使其比較的是內容。來看string...

Fabric 原始碼解析 原始碼目錄解析

這裡對重要的一些目錄進行說明 bccsp 與密碼學 加密 簽名 證書等等 相關的加密服務 將fabric中用到的密碼學相關的函式抽象成了一組介面,便於拓展。bddtests 一種新型的軟體開發模式 行為驅動開 需求 開發 common 一些公共庫 錯誤處理 日誌處理 賬本儲存 策略以及各種工具等等 ...