欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

什么是Map接口

本篇內(nèi)容主要講解“什么是Map接口”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“什么是Map接口”吧!

創(chuàng)新互聯(lián)于2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目做網(wǎng)站、網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢想脫穎而出為使命,1280元瀘溪做網(wǎng)站,已為上家服務(wù),為瀘溪各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220

Map接口

之前已經(jīng)學(xué)習(xí)了Collection接口以及其對應(yīng)的子接口,可以發(fā)現(xiàn)在Collection接口之中所保存的數(shù)據(jù)全部都只是單個(gè)對象,而在數(shù)據(jù)結(jié)構(gòu)中除了可以進(jìn)行單個(gè)對象的保存外,也可以進(jìn)行二元偶對象的保存(key=value)的形式來存儲,而存儲二元偶對象的核心意義在于需要通過key獲取對應(yīng)的value。

在開發(fā)中,Collection集合保存數(shù)據(jù)的目的是為了輸出,Map集合保存數(shù)據(jù)的目的是為了進(jìn)行key的查找。

Map接口是進(jìn)行二元偶對象保存的最大父接口。該接口定義如下:

public interface Map<K,V>

該接口為一個(gè)獨(dú)立的父接口,并且在進(jìn)行接口對象實(shí)例化的時(shí)候需要設(shè)置Key與Value的類型,也就是在整體操作的時(shí)候需要保存兩個(gè)內(nèi)容,在Map接口中定義有許多操作方法,但是需要記住以下的核心操作方法:

No.方法名稱類型描述
01public V put(K key,V value)普通向集合中保存數(shù)據(jù)
02public V get(Object key)普通根據(jù)key查詢數(shù)據(jù)
03public Set<Map.Entry<K,V>> entrySet()普通將Map集合轉(zhuǎn)為Set集合
04public boolean containsKey(Object key)普通查詢指定的key是否存在
05public Set<K> keySet()普通將Map集合中的key轉(zhuǎn)為Set集合
06public V remove(Object key)普通根據(jù)key刪除指定的數(shù)據(jù)

從JDK1.9之后Map接口里面也擴(kuò)充了一些靜態(tài)方法供用戶使用。
范例:觀察Map集合的特點(diǎn)

import java.util.Map;public class JavaAPIDemo {public static void main(String[] args) throws Exception {
//        Map<String,Integer> map=Map.of("one",1,"two",2);
//        System.out.println(map);     //{one=1,two=2}
//       
//        Map<String,Integer> map=Map.of("one",1,"two",2,"one",101);
//        System.out.println(map);    //Exception in thread "main" java.lang.IllegalArgumentException: duplicate key: one
        
        Map<String,Integer> map=Map.of("one",1,"two",2,null,0);System.out.println(map);  //Exception in thread "main" java.lang.NullPointerException
    }
}

在Map集合之中數(shù)據(jù)的保存就是按照“key=value”的形式存儲的,并且使用of()方法操作時(shí)里面的數(shù)據(jù)是不允許重復(fù),如果重復(fù)則會出現(xiàn)“IllegalArgumentException”異常,如果設(shè)置的內(nèi)容為null,則會出現(xiàn)“NullPointerException”異常。

對于現(xiàn)在見到的of()方法嚴(yán)格意義上來說并不是Map集合的標(biāo)準(zhǔn)用法,因?yàn)檎5拈_發(fā)中需要通過Map集合的子類來進(jìn)行接口對象的實(shí)例化,而常用的子類:HashMap、HashTable、TreeMap、LinkedHashMap。

HashMap子類

HashMap是Map接口中最為常見的一個(gè)子類,該類的主要特點(diǎn)是無序存儲,通過Java文檔首先來觀察一下HashMap子類的定義:

public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable

該類的定義繼承形式符合之前的集合定義形式,依然提供有抽象類并且依然需要重復(fù)實(shí)現(xiàn)Map接口。

什么是Map接口
HashMap子類

范例:觀察Map集合的使用

import java.util.HashMap;import java.util.Map;public class JavaAPIDemo {public static void main(String[] args) throws Exception {
        Map<String,Integer> map = new HashMap<String,Integer>();map.put("one",1);map.put("two",2);map.put("one",101);    //key重復(fù)map.put(null,0);       //key為nullmap.put("zero",null);    //value為nullSystem.out.println(map.get("one"));    //key存在:101System.out.println(map.get(null));    //key存在:0System.out.println(map.get("ten"));     //key不存在:null}
}

以上的操作形式為Map集合使用的最標(biāo)準(zhǔn)的處理形式,通過代碼可以發(fā)現(xiàn),通過HashMap實(shí)例化的Map接口可以針對key或者value保存null的數(shù)據(jù),同時(shí)也可以發(fā)現(xiàn)即便保存數(shù)據(jù)的key重復(fù),那么也不會出現(xiàn)錯誤,而是出現(xiàn)內(nèi)容的替換。

但是對于Map接口中提供的put()方法本身是提供有返回值的,那么這個(gè)返回值指的是在重復(fù)key的情況下返回舊的value。
范例:觀察put()方法

import java.util.HashMap;import java.util.Map;public class JavaAPIDemo {public static void main(String[] args) throws Exception {
        Map<String, Integer> map = new HashMap<String,Integer>();
        System.out.println(map.put("one", 1));    //key不重復(fù),返回null:nullSystem.out.println(map.put("one", 101));   //key重復(fù),返回舊數(shù)據(jù):1}
}

在設(shè)置了相同key的內(nèi)容的時(shí)候,put()方法會返回原始的數(shù)據(jù)內(nèi)容。

清楚了HashMap的基本功能之后,接下來就需要研究一下HashMap中給出的源代碼。HashMap之中肯定需要存儲大量的數(shù)據(jù),那么對于數(shù)據(jù)的存儲,來看看HashMap是怎樣操作的:

public HashMap() {this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted}

當(dāng)使用無參構(gòu)造的時(shí)候,會出現(xiàn)有一個(gè)loadFactor屬性,并且該屬性默認(rèn)的內(nèi)容為“0.75”(static final float DEFAULT_LOAD_FACTOR = 0.75f;

public V put(K key, V value) {return putVal(hash(key), key, value, false, true);
}

在使用put()方法進(jìn)行數(shù)據(jù)保存時(shí)會調(diào)用一個(gè)putVal()方法,同時(shí)會將key進(jìn)行hash處理(生成一個(gè)hash碼),而對于putVal()方法中會發(fā)現(xiàn)會提供一個(gè)Node節(jié)點(diǎn)類進(jìn)行數(shù)據(jù)的保存,而在使用putVal()方法操作的過程中,會調(diào)用一個(gè)resize()方法可以進(jìn)行容量的擴(kuò)充。

面試題:在進(jìn)行HashMap的put()操作時(shí),如何實(shí)現(xiàn)容量擴(kuò)充?

  • 在HashMap類中提供了一個(gè)“DEFAULT_INITIAL_CAPACITY”的常量,作為初始化的容量配置,而這個(gè)常量的默認(rèn)大小為16個(gè)元素,也就是說默認(rèn)的可以保存的最大內(nèi)容是16;

  • 當(dāng)保存的內(nèi)容的容量超過了一個(gè)閾值(DEFAULT_LOAD_FACTOR=0.75f),相當(dāng)于“容量*閾值=12”保存12個(gè)元素的時(shí)候就會進(jìn)行容量的擴(kuò)充;

  • 在進(jìn)行擴(kuò)充的時(shí)候HashMap采用的是成倍的擴(kuò)充模式,即:每一次都擴(kuò)充2倍的容量。

面試題:請解釋HashMap的工作原理(JDK1.8之后開始的)

  • 在HashMap中進(jìn)行數(shù)據(jù)存儲依然是利用Node類完成的,那么這種情況下就證明可以使用的數(shù)據(jù)結(jié)構(gòu)只有兩種:鏈表(時(shí)間復(fù)雜度“O(n)”)、二叉樹(時(shí)間復(fù)雜度“O(logn)”);

  • 從JDK1.8開始,HashMap的實(shí)現(xiàn)出現(xiàn)了改變,因?yàn)槠湟m應(yīng)于大數(shù)據(jù)時(shí)代的海量數(shù)據(jù)問題,所以對其存儲發(fā)生了變化,并且在HashMap類的內(nèi)部提供有一個(gè)常量:“static final int TREEIFY_THRESHOLD = 8;”,在使用HashMap進(jìn)行數(shù)據(jù)保存時(shí),如果保存的數(shù)據(jù)沒有超過閾值8(TREEIFY_THRESHOLD),那么會按照鏈表的形式進(jìn)行存儲,如果超過了閾值,則會將鏈表轉(zhuǎn)為紅黑樹以實(shí)現(xiàn)樹的平衡,并且利用左旋與右旋保證數(shù)據(jù)的查詢性能。

LinkedHashMap子類

HashMap雖然是Map集合中最為常用的子類,但是其本身保存的數(shù)據(jù)都是無序的(有序與否對Map沒有影響),如果現(xiàn)在希望Map集合中的保存的數(shù)據(jù)的順序?yàn)槠湓黾禹樞?,則就可以更換子類為LinkedHashMap(基于鏈表實(shí)現(xiàn)的),觀察LinkedHashMap類的定義形式:

public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>

既然是鏈表保存,所以一般在使用LinkedHashMap類時(shí)數(shù)據(jù)量不要特別大,因?yàn)闀斐蓵r(shí)間復(fù)雜度攀升,通過繼承的結(jié)構(gòu)可以發(fā)現(xiàn)LinkedHashMap是HashMap的子類,繼承關(guān)系如下:

image.png
LinkedHashMap

范例:使用LinkedHashMap

import java.util.LinkedHashMap;import java.util.Map;public class JavaAPIDemo {public static void main(String[] args) throws Exception {
        Map<String, Integer> map = new LinkedHashMap<String, Integer>();map.put("one", 1);map.put("two", 2);map.put("one", 101);map.put("null", 0);map.put("zero", null);
        System.out.println(map);    //{one=101, two=2, null=0, zero=null}}
}

通過此時(shí)的程序執(zhí)行可以發(fā)現(xiàn)當(dāng)使用LinkedHashMap進(jìn)行存儲之后所有數(shù)據(jù)的保存順序?yàn)樘砑禹樞颉?/p>

HashTable子類

HashTable類是從JDK1.0時(shí)提供的,與Vector、Enumeration屬于最早的一批動態(tài)數(shù)組的實(shí)現(xiàn)類,后來為了將其繼續(xù)保留下來,所以讓其多實(shí)現(xiàn)了一個(gè)Map接口,HashTable類的定義如下:

public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable

HashTable的繼承結(jié)構(gòu)如下:

什么是Map接口
HashTable子類

范例:觀察HashTable子類的使用

import java.util.Hashtable;import java.util.Map;public class JavaAPIDemo {public static void main(String[] args) throws Exception {
        Map<String, Integer> map = new Hashtable<String,Integer>();map.put("one", 1);map.put("two", 2);map.put("one", 101);// map.put(null, 0);     //不能為空// map.put("zero",null);   //不能為空,Exception in thread "main">System.out.println(map);  // {two=2, one=101}}
}

通過觀察可以發(fā)現(xiàn)在HashTable中進(jìn)行數(shù)據(jù)存儲時(shí)設(shè)置的key或value都不允許為null,否則會出現(xiàn)NullPointerException異常。

面試題:請解釋HashMap與HashTable的區(qū)別?

  • HashMap中的方法都屬于異步操作,非線程安全,HashMap允許保存有null的數(shù)據(jù);

  • HashTable都屬于同步方法(線程安全),HashTable不允許保存null,否則會出現(xiàn)NullPointerException異常;

到此,相信大家對“什么是Map接口”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

本文名稱:什么是Map接口
瀏覽地址:http://aaarwkj.com/article42/ijhhhc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、網(wǎng)站策劃、網(wǎng)站建設(shè)、域名注冊商城網(wǎng)站、服務(wù)器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
麻豆精东传媒一区二区| 欧美一区二区三区四区久久| 日韩不卡在线免费观看视频| 免费观看亚洲成人av| 91中文字幕在线一区| 欧美日韩福利一区二区三区| 白浆熟女精品国产91| 中文字幕精品一区二区三区精品| 日韩国产人妻一区二区| 国产一区二区欧美久久| 日本一级黄色影视大全| 在线观看精品日本一区二| 亚洲午夜一区二区精品| 日本美女阴部毛茸茸视频| 国产三级精品在线免费| 国产白丝诱惑在线视频| 高清美女视频亚洲免费| 巴西老熟女大奶子多毛逼| 久久麻豆精亚洲av品国产一区| 亚洲国产日韩欧美一级| 国产福利成人一区二区| 欧美日韩亚洲中文国产| 国产成人综合在线观看网站| 粉嫩国产av一区二区三区| 一区二区三区欧美日韩| 未满十八禁止观看免费| 人妻鲁丝一区二区三区| 久久精品91久久久| 日本色小姐美国青青草原| 91老熟女露脸大合集| 91九色最新国产在线| 一区二区三区四区在线视频观看| 亚洲日本不卡在线一区二区| 国产一区二区乱码在线| 亚洲精品一级黄色片| 大香蕉国产精品视频在线| 欧美精品成人在线一区| 国产欧美日韩91成人| 欧美一区二区三区东京热| 怡红院一区二区三区毛片| 伊人亚洲一区二区三区|