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);
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的狀況,即000一、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類型能夠進行 位運算,而且運算符優先級:>, &, &&,且位運算符與邏輯運算符的效果同樣,可是不會短路。