1. 程式人生 > >2,Java中的資料結構

2,Java中的資料結構

 

1,字串(String) ···String為特殊的引用型別,不可變。 ···常用例項方法:     獲取子串:substring(start, end);     獲取索引:indexOf(char);     獲取字元:charAt(index); ···常用靜態方法:     格式字串:String.format("%s", 12);     轉為字串:String.valueOf();     格式拼接:String.join(", ", list); ···擴充套件:     StringBuilder:可變物件,用來高效拼接字串。     StringBuffer:是StringBuilder的執行緒安全版。 ··· 注意:     · String.valueOf()比str.toString()安全;     · 常量池預設只會在編譯期對字串字面量和常量進行優化;可以通過"".intern()方法在執行期將堆中的字串放入常量池。   2,陣列 ···可以通過索引訪問,初始化必須指定大小,並且不可改變。 ···常用方法:     排序:Arrays.sort(int[]);     轉list:Arrays.asList(int[]);  // 返回的list是固定長度的,不能改變。最好用for一個個轉。     擴容:Arrays.copyOf(int[], newlenght);     填充:Arrays.fill(int[], int); ···轉Set:     Set<T> set = new HashSet<>(Arrays.aslist(int[]));     由於Set構造方法的引數必須繼承自Collection介面,所以要先把陣列轉list。 ···逆序排序:     Integer[] a = new Integer[5];     Comparator<Integer> cmp = new Comparator<>() {     @Override     public int compare(Integer o1, Integer o2) {            return o2 - o1;         }     }; Arrays.sort(a, cmp);   Collection族: https://blog.csdn.net/zhangqunshuai/article/details/80660974
  3,列表(List) ···實現類:     ArrayList:陣列實現;LinkedList:連結串列實現;Vector:執行緒安全; ···常用例項方法:     根據索引查詢:get(index);     判斷是否存在:contains(obj);     查詢索引:indexOf(obj);     排序:sort(Comparator);     合併兩個list:addAll(list);     轉陣列:toArray(new Obj[]{}); ···常用靜態方法:     排序:Collections.sort(list,Comparator);     逆序:Collections.reverse(list);     求最值:Collections.max(list); Collection.min(list);     淺拷貝:Collections.copy(dest, src);  // dest的實際長度必須大於或等於src ···List的stream方法:     List<Integer> list = new ArrayList<>(Arrays.asList(1,2,3));     List<Integer> a = list.stream().map(x-> x*2).collect(Collectors.toList());   4,集合(Set) ···實現類:     HashSet:陣列實現,無序(有規律);TreeSet:自動排序;LinkedHashSet:連結串列實現,保持原序; ···注意:      由於Set也繼承自Collection介面,所以其他方法與List類似,底層實現也是Hash,相當於是沒有value的Map。   5,鍵值對(Map) ···實現類:     HashMap:陣列實現,無序;TreeSet:根據Key排序;LinkedHashMap:保持原序; ···常用例項方法:     獲得所有Key:KeySet(),返回值為Set型別;     獲得所有Value:values(); ···排序:     先把map.entrySet()放入list,再用Collection.sort(list, Compartor);對list的value排序,再把list放入LinkedHashMap中即可。 ···注意:     HashMap中的key和value都可以為null。而Hashtable不可以。 ··· *底層理解*: ·大致實現:HashMap底層使用的是雜湊表加連結串列。輸入的key是物件的hashCode;雜湊函式是hashCode & (lenght - 1);雜湊衝突的解決辦法是使用連結串列儲存雜湊值相同的物件。當連結串列長度大於8時使用紅黑樹儲存(jdk1.8開始);查詢時先通過物件的hashCode找到物件在陣列的位置,然後通過equals()遍歷連結串列,找到目標物件。 ·細節優化: 雜湊函式hashCode & (lenght-1)是位運算, 比模運算快很多;由於雜湊函式是hashCode & (lenght-1),所以當雜湊表的長度lenght是2的冪次方時雜湊表的利用率最高,雜湊衝突也就越小,比如:當lenght為15時hashCode & 14,hashCode & 1110 時第一位0與上任何數都為0,所以雜湊函式的結果永遠不會出現第一位為1的情況,即0001、0011等位置上永遠不會存值,導致實際利用長度變小,也就越容易出現雜湊衝突。 ·擴容:由於陣列的長度固定(預設是16),所以當實際長度超過最大長度的75%時,需要對雜湊陣列進行擴容,增大為原最大長度的2倍,並將舊雜湊表的元素重新計算雜湊值放入新的雜湊表中,非常消耗效能,所以在初始化時儘量指定長度,以避免擴容。例如:需要存放1000個元素時,指定初始化大小為2048(1024*75%<1000所以還會擴容,因此選擇2048)。   6,包裝型別 ···概念:包裝型別是把基本型別包裝為引用型別,把基本型別轉為引用型別稱為裝箱,反之為拆箱。 ···優點:     · 與基本型別相比,包裝型別提供了大量實用的方法。     · 在專案中儘量使用包裝型別,因為包裝型別的null和0可以區分有值和沒值。   注意事項     · a=a+12 與 a+=12 的區別:當a為short時,使用會把12當成int型別;而使用 += 時,會把右邊的字面量12轉為左邊變數的型別。     · 進位制顯示:二進位制(0b):int b=0b101;  八進位制(0):int e=032;  十六進位制(0x):int h=0xf1;     · Boolean型別:boolean型別可以進行 位運算,並且運算子優先順序:>, &, &&,且位運算子與邏輯運算子的效果一樣,但是不會短路。

&nb