集合 字串底層的長度變化及原始碼

2021-10-08 02:05:23 字數 1888 閱讀 8461

一、字串

1.string類、stringbuilder類、stringbuffer類是三個字串相關類。string類是的物件代表不可變的字串行,stringbuilder類和stringbuffer類代表可變字串行

2.string是乙個final類 他不能有其他的子類 final修飾的類不能被繼承

它的底層是乙個陣列

這裡需要說明一點:在jdk9的時候 大佬們對它的底層進行了改變 為了節省空間 由字元型陣列改變成為了位元組型的陣列

二、stringbuilder和stringbuffere

1.他們非常相似 方法幾乎相同 都是不可改變的字串行

2.區別是:

stringbuilder:是jdk1.5提供的類 執行緒不安全 但是效率高 少了約束

stringbuffer:是jdk1.0版本提供的類 執行緒安全但是效率很低

3.stringbuilder的底層原始碼:重點來嘍!!!

它的預設長度是16 也可以指定初始化長度

public final class stringbuilder

public stringbuilder(int capacity)

public int length()

public int capacity()

public string tostring()

}當儲存空間不夠的時候 需要擴容的時候 預設規則是長度16*n+2

原始碼:三、linkedlist

1.arraylist是乙個動態陣列預設為object 底層是乙個雙向鍊錶

2.版本的不同 底層原始碼也會進行修改讓他的功能進一步的增加

1.7中 預設的底層長度是10

1.8中預設的長度為0

3.規則是:容量不足的時候進行擴充 如果擴充了1.5倍還不滿足的話 就會增長到新元素的數量 :

比如長度是 17 原來的長度是10 增加到15 還是無法滿足 那就自動變為最小容納的數量 就會增長到17

原始碼:

public arraylist()

private static int calculatecapacity(object elementdata, int mincapacity)

return mincapacity;

}

private void grow(int mincapacity) 

四、hashmap

1.hashmap底層是乙個table陣列+鍊錶實現的雜湊表儲存結構 鍊錶的每個節點就是乙個entry 其中包括:鍵key、值value、鍵的雜湊碼hash、執行下乙個節點的引用next四部分

2.•新增元素時如達到了閾值,需擴容,每次擴容為原來主陣列容量的2倍

原始碼:

public class hashmapimplements map

public hashmap(int initialcapacity, float loadfactor)

}3.在jdk1.8中有一些變化,當鍊表的儲存資料個數大於等於8的時候,不再採用鍊錶儲存,而採用紅黑樹儲存結構。這麼做主要是查詢的時間複雜度上,鍊錶為o(n),而紅黑樹一直是o(logn)。如果衝突多,並且超過8,採用紅黑樹來提高效率

**五、舊的集合類**

•vector是早期jdk介面,arraylist是替代vector的新介面

•vector執行緒安全,效率低下;arraylist重速度輕安全,執行緒非安全

•長度需增長時,vector預設增長一倍,arraylist增長50%

字串固定長度 易語言 易語言字串操作原始碼

易語言字串操作原始碼 系統結構 字串 取長度,字串 取中間,字串 取左邊,字串 取右邊,字串 替換,到寬字元,到多位元組,取文字資料位址,取位元組集資料位址,multibytetowidechar,widechartomultibyte,程式集1 啟動子程式 臨時子程式 程式集 字串 字串 取長度 ...

字串及長度

輸出字串最後乙個字元的長度 s show me your code j 0 for i in s 1 1 if i j 1else break print j 輸出一句話中最長單詞的第乙個單詞和長度 def longestletter s s s.split word s 0 word len le...

字串的長度

題目描述 設計函式,求乙個字串的長度。在主函式中輸入字串,並輸出其長度。輸入 輸入乙個字串 輸出 輸出該字串的長度 樣例輸入 123456789!樣例輸出 15這個題題目本來就有函式可以用的,所以感覺有點 脫褲子放屁 畫蛇添足 的感覺,但是題目要求我們這麼做了,那我們就按它說的辦。上 include...