Map接口與HashMap基本使用

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

/**
 * Map接口:
 * 1、鍵值對存儲一組對象
 * 2、Key不能重復(fù)(唯一),Value可以重復(fù)
 * 3、具體的重點實現(xiàn)類:HashMap  TreeMap  Hashtable  LinkedHashMap
 */

public class MapDemo {
    public static void main(String[] args) {
        hashMap();
    }
    /**
     * HashMap的實現(xiàn)原理:
    1、基于哈希表(數(shù)組+鏈表+二叉樹(紅黑樹)1.8jdk才實現(xiàn)的)
    2、默認加載因子為0.75(加載因子是指:當存儲的數(shù)據(jù)占據(jù)了總?cè)萘康?5%就不在存儲或者需要擴容),默認數(shù)組大小是16
    3、把對象存儲到哈希表中,如何存儲的?
    把key對象通過hash()方法計算hash值,然后用這個hash值對數(shù)組長度取余數(shù)(默認16),來決定該Key對象
    在數(shù)組中存儲的位置,當這個位置有多個對象時,以鏈表結(jié)構(gòu)存儲,jdk1.8后,當鏈表長度大于8時,鏈表將轉(zhuǎn)換為紅黑樹結(jié)構(gòu)存儲。
    這樣做的目的:是為了取值更快,存儲的數(shù)據(jù)量越大,性能的表現(xiàn)越明顯。
    4、 擴充原理:當數(shù)組的容量超過了75%,那么表示該數(shù)組需要擴充,如何擴充?    
    擴充的算法是:當前數(shù)組容量<<1(相當于是乘2,擴大1倍)   ,擴充次數(shù)過多,會影響性能 ,每次擴充表示哈希表重新散列(重新計算每個對象的存儲位置),
    我們在開發(fā)中盡量要減少擴充次數(shù)帶來的性能問題
    5、線程不安全,適合在單線程中使用。 
     */
    
    public static void hashMap() {
        Map<Integer,String> map = new HashMap<>();
        //Map的存儲:先將(1,"Tom")new了一個Entry保存,然后將Entry再存入Map中,如此實現(xiàn)Map中鍵值的存儲
        map.put(1, "Tom");  //存入Map
        map.put(2, "Jerry");
        map.put(3, "Lily");
        map.put(4, "Bob");
        
        //從Map中取值:通過key取value
        System.out.println(map.get(1));
        
        //Map的第一種遍歷:這里的Entry<Integer,String> 就是存儲在Map中的Entry對象
        //即遍歷Map里面的entry生成一個Set集合
        //Set<Entry>,Set集合的泛型是Entry,而Entry的泛型又是Integer,String;所以寫成:Set<Entry<Integer,String>>
        Set<Entry<Integer,String>> entry = map.entrySet();
        for(Entry e:entry) {   //
            System.out.println(e.getKey()+"->"+e.getValue());
        }
        
        //Map的第二種遍歷:遍歷key,然后通過key取值
        //遍歷key生成一個Set集合,里面的泛型是Integer
        Set<Integer> keys = map.keySet();
        for(Integer k:keys) {
            System.out.println(map.get(k));
        }
        
        //Map的第三種遍歷:直接遍歷value
        //遍歷Value生成一個Set集合,里面的泛型是String
        Collection<String> values = map.values();
        for(String v:values) {
            System.out.println(v);
        }
        
        //Map的第四種遍歷:forEach(BiConsumer<? super K,? super V> action)
        //BiConsumer:是一個功能界面,因此可以用作lambda表達式或方法引用的賦值對象
        //這里參數(shù)(key,value)的類型省略了,可以帶上也可以不帶上(Integer key,String value)
        map.forEach((Key,value)->System.out.println(Key+"->"+value));
        
        //是否包含某key;返回boolean
        System.out.println(map.containsKey(5));
        
        
    }
    

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容