原始碼級理解Java的String型別(之二)

2021-09-02 09:32:11 字數 1352 閱讀 4115

string的hashcode

字串的拼接。

流與字符集的轉換

codepointat 用法

我們知道integer的hashcode就是數值本身,那麼字串型別的如何計算的呢?

原始碼中注釋已經說明了他的演算法:

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
同時**也已經給出了實現,這裡的^符號表示的冪,而不是異或運算符號。

string中已經提供了concat 的的辦法,同時也可以使用+符號進行計算。他們的區別究竟在**?

首先看看concat:**如下

char buf = arrays.copyof(value, len + otherlen);  // 申請陣列  長度等於兩個字串的和

str.getchars(buf, len); // 把第二個字串的內容填充到陣列中。

return new string(buf, true);// 建立新的字串中並返回。

而使用+ 的形式則不是這樣的,它借助了stringbuilder的類。參照例子如下**

string s1="12";

string s2="34";

string ss = s1+s2;

位元組陣列中每個位元組佔8位,用於表達英文本元以及數字等符號是足夠使用的,但是世界有各種各樣的語言,字元種類很多,如何用位元組流表達各種各樣的字元呢,這就引入了字符集的概念。同樣的位元組流在不同字符集下所表示的符號是不同的,所以字串與bytes進行相互轉換的時候需要指定字符集。

string的encode 和decode方法實際上都借助了stringcoding工具類,使用該工具類在沒有指定字符集的情況下,預設使用iso-8859-1字符集。

參見建構函式 string(byte bytes, int offset, int length, charset charset)  即可。

這裡返回的是乙個int型別,大家知道字串實際上由char型別組成,而無符號的char取值範圍是0--65536.而字串需要表達複雜符號的時候需要兩個字元甚至三個位元組來表達,而使用本方法就可以完整的獲得複雜符號的具體的整數數值。他的演算法是先得到該位置上的char型別的數值,然後在獲取其下乙個位置上的char型別數值,如果下乙個元素的數值介於'\udc00' 和 '\udfff'之間則將這兩個char數值進行運算,運算規則是(

((high - min_high_surrogate) << 10)

// + (low - min_low_surrogate)

// + min_supplementary_code_point;

) 得到乙個整型值返回,否則直接返回當前位置上的元素的數值。

python原始碼理解

1,一切都是物件 2,typedef struct objectpyobject pyobject是不可變長度的物件 3,typedef structpyvarobject 可變長度的物件 4,每乙個物件都對應乙個型別物件 pytype type 5,每乙個物件都有乙個引用計數器 6,在python...

ArrayList原始碼理解

與linkedlist原始碼理解放在一起查閱,效果更好 對隊成員變數的分析,可以知道arraylist的資料結構 對add 方法的分析,可以得知arraylist新增資料的效率不高 對get 方法的分析,可以看出arraylist查詢的效率非常高 對remove 方法的分析,可以了解到arrayli...

ThreadLocal原始碼理解

threadlocal其實原理是建立了多份相同資料儲存在堆記憶體上,每個執行緒的thread類裡有threadlocal.threadlocalmap threadlocals的屬性來指向存位置,所以每個執行緒修改都不會影響到其他執行緒的資料 首先說下下面用到的東西 threadlocalmap為t...