Map/IO流
Map
HashMap:作為Map的主要實(shí)現(xiàn)類,效率高,可以存儲null;數(shù)組+鏈表(1.7以前) 數(shù)組+鏈表+紅黑樹(1.8)
LinkedHashMap:保證遍歷map元素時(shí),可以按照添加的順序?qū)崿F(xiàn)遍歷。
原因:在原有map的基礎(chǔ)上,添加了一對指針,指向前一個(gè)和后一個(gè)。
TreeMap:保證按照添加的K-V對進(jìn)行排序,實(shí)現(xiàn)排序遍歷。此時(shí)使用key進(jìn)行排序。
底層使用紅黑樹。
Hashtable:作為古老的實(shí)現(xiàn)類;線程安全,效率低;不能存儲null的key和value
Properties:常用來處理配置文件
Map中的
key:無序的、不可重復(fù)的,使用Set存儲所有的entry; ---> key所在類需要重寫equals()和HashCode();
value:無序的,可重復(fù)的,使用Collection存儲所有的value; 需要重寫equals()方法;
一個(gè)鍵值對:構(gòu)成一個(gè)Entry對象
Map中的entry:無序的、不可重復(fù)的,使用Set存儲所有的entry
源碼分析(HashMap)
jdk7
在實(shí)例化以后,底層創(chuàng)建了長度是16的一維數(shù)組 Entry[] table ;
map.put(key1,value1);
首先調(diào)用key1所在類的hashCode()計(jì)算key1哈希值,此哈希值經(jīng)過某種算法計(jì)算以后,得到在Entry數(shù)組中的存放位置。如果此位置上的數(shù)據(jù)為空,此時(shí)的key1-value1添加成功
如果此位置上的數(shù)據(jù)不為空,比較key1和已經(jīng)存在的一個(gè)或多個(gè)數(shù)組的哈希值:如果key1的哈希值與已經(jīng)存在的數(shù)組的哈希值都不相同,此時(shí)key1-value1添加成功;如果存在相同的,繼續(xù)比較:調(diào)用key1所在類的equals()方法;如果false,添加成功;如果true,使用value1替換value2;
默認(rèn)的擴(kuò)容方式;擴(kuò)容為原來容量的2倍,并將原有的數(shù)據(jù)復(fù)制過來。擴(kuò)容的時(shí)候,會重新算一次hash值。
默認(rèn)加載因子:0.75;當(dāng)添加的時(shí)候達(dá)到了0.75,但新的key對應(yīng)沒有形成鏈表,也是直接加進(jìn)去的。
jdk8
new HashMap(); 底層沒有創(chuàng)建一個(gè)長度為16的Node[] 數(shù)組
首次調(diào)用put方法時(shí),底層創(chuàng)建長度為16的數(shù)組
當(dāng)數(shù)組的某一個(gè)索引位置上的元素以鏈表形式存在的數(shù)據(jù)個(gè)數(shù) >8 且當(dāng)前數(shù)組的長度 > 64時(shí),此時(shí)此索引位置上的所有數(shù)據(jù)改為使用紅黑樹存儲。
需要關(guān)心的幾個(gè)值
DEFAULT_INITIAL_CAPACITY: HashMap 的默認(rèn)容量 :16
DEFAULT_LOAD_FACTOR: HashMap 的默認(rèn)加載因子 : 0.75
threshold: 擴(kuò)容的臨界值 = 容量*填充因子
TREEIFY_THRESHOLD:Bucket 中鏈表長度大于該默認(rèn)值,轉(zhuǎn)化為紅黑樹:8
MIN_TREEIFY_CAPACITY: 桶中的Node被樹化時(shí)最小的hash表容量:64
LinkedHashMap的底層實(shí)現(xiàn)原理:
繼承于HashMap ,區(qū)別:其內(nèi)部提供了Entry,替換HashMap中的Node
Collections
reverse();// 反轉(zhuǎn)list
shuffle();// 隨機(jī)排序
如果程序要求線程安全,可以使用Collections將ArrayList和Map轉(zhuǎn)化為線程安全的
泛型
在指明完以后,在接口類或接口中凡是定義類或接口時(shí),內(nèi)部結(jié)構(gòu)(比如:方法、構(gòu)造器、屬性),在實(shí)例化以后,都會變成具體的泛型類型。比如 add(E e) -- > 實(shí)例化以后: add(Integer e) ;
泛型的類型必須是類,不能是基本數(shù)據(jù)類型。需要用到基本數(shù)據(jù)類型的位置,需要使用包裝類來替換。
自定義泛型
泛型類、泛型接口
如果子類在繼承帶泛型的父類時(shí),指明了泛型類型,則實(shí)例化子類對象時(shí),不需要指明泛型。
泛型類可能有多個(gè)參數(shù);
構(gòu)造器是不帶泛型的:public GenericClass(){};
在編譯的時(shí)候,只會有一個(gè)ArrayList被加載到JVM中,即使是有兩種不同泛型的ArrayList
泛型的不同引用不能相互賦值。
在靜態(tài)結(jié)構(gòu)中不嫩更實(shí)用類的泛型。類的泛型是在實(shí)例化的時(shí)候才有。
異常類不能聲明為泛型類

泛型方法
在方法中出現(xiàn)了泛型結(jié)構(gòu),泛型參數(shù)與類的泛型參數(shù)沒有任何關(guān)系。泛型方法所屬的類是不是泛型類都沒有關(guān)系
泛型方法,可以聲明為靜態(tài)的。原因:泛型參數(shù)是在調(diào)用方法時(shí)確定的。并非在實(shí)例化類時(shí)確定。
在繼承關(guān)系的體現(xiàn)
類A是類B的父類,但在泛型中是屬于并列的結(jié)構(gòu)。
補(bǔ)充:類A是類B的父類,A<G> 是 B<G>的父類
通配符
<?>
添加:對于List<?>就不能向其內(nèi)部添加數(shù)據(jù)
獲?。涸试S讀取數(shù)據(jù),讀取的數(shù)據(jù)類型為Object
有限制條件的通配符的使用:
IO流
file
三個(gè)構(gòu)造器
獲取功能
流
按操作數(shù)據(jù)單位不同分為:字節(jié)流(8 bit),字符流(16 bit)
按流角色的不同分為:節(jié)點(diǎn)流,處理流

new FileWriter(String pathname,boolean append); // true 追加 false 覆蓋
對于文本文件,使用字符流處理;對于非文本文件,使用字節(jié)流處理。
關(guān)閉流:關(guān)閉外層流的同時(shí),內(nèi)層流也會被關(guān)閉

轉(zhuǎn)換流

轉(zhuǎn)換流:屬于字符流
InputStreamReader : ?將一個(gè)字節(jié)的輸入流轉(zhuǎn)換為字符的輸入流
OutputStreamWriter : 將一個(gè)字符的輸出流轉(zhuǎn)化為字節(jié)的輸出流
作用:提供字節(jié)流與字符流之間的轉(zhuǎn)換
解碼:字節(jié)、字節(jié)數(shù)組 --> 字符數(shù)組、字符串
編碼:字符數(shù)組、字符串 --> 字節(jié)、字節(jié)數(shù)組