day16
一/map集合
1.定義:
*map集合是一個(gè)雙列集合,以鍵值對(duì)的形式存在
*將鍵和值捆綁到一起存放(Map.Entry)
*一個(gè)映射不能包含重復(fù)的鍵
*如果出現(xiàn)相同的鍵,會(huì)用新的覆蓋老的值
*每個(gè)鍵最多只能映射到一個(gè)值
2.Map接口和Collection接口的不同
*map是雙列的,Collection是單列的
*map集合的數(shù)據(jù)結(jié)構(gòu)針對(duì)鍵有效,跟值無關(guān),Collection集合的數(shù)據(jù)結(jié)構(gòu)是針對(duì)元素有效
3.常用方法
*添加方法
put(key,value)添加元素
如果鍵是第一次存儲(chǔ),直接存儲(chǔ)元素,返回null
如果鍵不是第一個(gè)存在,就用值把以前的值替換掉,返回以前的值
*刪除方法
void clear 移除所有的鍵值對(duì)元素
remove,根據(jù) 鍵刪除鍵值對(duì)元素,并把值返回
*判斷方法
boolean containsKey 判斷集合是否包含指定的鍵
containsValue判斷集合是否包含指定的鍵
isEmpty判斷集合是否為空
*獲取方法
Set<Map.Entry<K,V>>entrySet(): 獲取所有的鍵值對(duì)
V get(Object key)根據(jù)建獲取值
Set<K> keySet()獲取集合中所有鍵的集合
Collection<V> values():獲取集合中所有的值的集合
int size()返回集合中鍵值對(duì)的個(gè)數(shù)
二/HashMap
1.定義
<1>底層使用的是數(shù)組
<2>.HashMap就是通過我們存入的key獲取到一個(gè)hash值,經(jīng)過計(jì)算之后,獲取到一個(gè)數(shù)組角標(biāo),然后將key和value封裝到一個(gè)Entry里面,然后存入數(shù)組
<3>.當(dāng)數(shù)組容量不夠的時(shí)候,會(huì)自動(dòng)擴(kuò)容一倍
2.構(gòu)造方法
<1>HashMap();構(gòu)造一個(gè)具有默認(rèn)初始容量(16)和默認(rèn)加載因子(0.75)的空HashMap
<2>HashMap(int initialCapacity);構(gòu)造一個(gè)指定初始容量和默認(rèn)加載因子(0.75)的空HashMap
<3>HashMap(int initialCapacity,float loadFactor);構(gòu)造一個(gè)帶指定初始容量和加載因子的空HashMap
<4>HashMap(Map<? extends K,? extends V>m);構(gòu)造一個(gè)映射關(guān)系與指定Map相同的新HashMap
3.常用方法
put(K key,V value):在此映射中關(guān)聯(lián)指定鍵和指定值
putAll(Map<? extends K,? extends V>m)將另外一個(gè)map集合復(fù)制到此集合中
四/HashMap和HashTable的區(qū)別
1.HashMap和HashTable的區(qū)別
- HashTable是JDK1.0版本出現(xiàn)的,線程安全,效率低,HashMap是JDK1.2版本出現(xiàn)的,線程不安全但是效率高
*HashTable不可以存儲(chǔ)null鍵和null值,HashMap可以存儲(chǔ)null鍵和null值
五/TreeMap
1.定義
*TreeMap通過比較元素的大小,對(duì)元素進(jìn)行排序,最后形成了一個(gè)樹狀結(jié)構(gòu)
*TreeMap中的key需要實(shí)現(xiàn)Comparabale接口并重寫compareTo方法,或者使用Comparator比較器
*存入元素的時(shí)候,如果將新添加的元素的key和集合中已經(jīng)存在的元素的key比較,返回一個(gè)小于0的數(shù),說明,新添加的元素小于已有元素,放到左邊去,如果返回的是一個(gè)等于0的,說明新添加的元素等于已有元素,如果返回一個(gè)大于0的數(shù),說明新添加的元素大于已有元素
六/泛型
1.定義
<1>泛型,既"參數(shù)化類型",泛型規(guī)定了類可以使用的應(yīng)用數(shù)據(jù)的類型的范圍
<2>只在編譯期生效
2.泛型的好處
<1>提高安全性(將運(yùn)行期的錯(cuò)誤轉(zhuǎn)換到編譯期)
<2>省去強(qiáng)轉(zhuǎn)的麻煩
<3>在其作用域內(nèi),可以統(tǒng)一參數(shù)類型
3.泛型的基本使用
<1><>中放的必須是引用數(shù)據(jù)類型
<2>泛型可以定義在類上和方法上
4.泛型使用注意事項(xiàng)
<1>前后的泛型必須一致,或者后面的泛型可以省略不寫
5.泛型的由來
<1>類型通過Object轉(zhuǎn)型問題引入
<2>早起的Object類型可以接受任意的對(duì)象類型,但是在實(shí)際的使用中,會(huì)有類型轉(zhuǎn)換的問題,也就存在著隱患,所以java提供了泛型來解決這個(gè)安全問題
七/泛型的使用
1.把泛型定義在類上
演示:(泛型類型必須是引用類型)
public class Teacher<T>{
private T t;
....
}
2.把泛型定義在方法上
public <泛型類型> 返回類型 方法名(泛型類型 變量名)
3.把泛型定義在接口上
<1>public interface 接口名 <泛型類型>
<2>子類去實(shí)現(xiàn)接口的時(shí)候就需要給出具體的類型,重寫抽象方法的時(shí)候就可以得到具體的類型
4.通配符
<1>泛型通配符<?>:任意類型,如果沒有明確,就是Object以及任意的java類了
<2>? extends E :向下限定E及E的子類
<3>? super E :向上限定E及其父類