亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        Java 容器類的選擇

        2019-11-30 03:39:03韓慶安珠海世紀(jì)鼎利科技股份有限公司
        數(shù)碼世界 2019年10期
        關(guān)鍵詞:方法

        韓慶安 珠海世紀(jì)鼎利科技股份有限公司

        關(guān)鍵字:Java 容器類

        Java 容器類有兩個(gè)基本的上層接口Collection 和Map,在兩種上層接口的基礎(chǔ)上,衍生了一系列的子接口以及其實(shí)現(xiàn)類。

        Collection,獨(dú)立元素的序列,這些元素都服從一條或多條規(guī)則。List、Set 都是Collection 的一種,List 強(qiáng)調(diào)順序,而Set 不能有重復(fù)元素。Map 是鍵值對(duì)類型,允許用戶通過鍵來查找對(duì)象。Hash 表允許使用另一個(gè)對(duì)象來查找某個(gè)對(duì)象。所有實(shí)現(xiàn)Collection 接口的類都必須提供兩個(gè)標(biāo)準(zhǔn)的構(gòu)造函數(shù):無參數(shù)的構(gòu)造函數(shù)用于創(chuàng)建一個(gè)空的Collection,有一個(gè)Collection 參數(shù)的構(gòu)造函數(shù)用于創(chuàng)建一個(gè)新的Collection,這個(gè)新的Collection 與傳入的Collection 有相同的元素。后一個(gè)構(gòu)造函數(shù)允許用戶復(fù)制一個(gè)Collection。

        List 是有序的Collection,使用此接口能夠精確的控制每個(gè)元素插入的位置。用戶能夠使用索引來訪問List 中的元素,除了具有Collection 接口必備的iterator()方法外,List 還提供一個(gè)listIterator()方法,返回一個(gè)ListIterator 接口,和標(biāo)準(zhǔn)的Iterator接口相比,ListIterator 多了一些add()之類的方法,允許添加,刪除,設(shè)定元素,還能向前或向后遍歷。

        實(shí)現(xiàn)List 接口的常用類有LinkedList,ArrayList 和Vector。

        ArrayList 實(shí)現(xiàn)了可變大小的數(shù)組。它允許所有元素,包括null。ArrayList 沒有同步。size,isEmpty,get,set 方法運(yùn)行時(shí)間為常數(shù)。但是add 方法開銷為分?jǐn)偟某?shù),添加n 個(gè)元素需要O(n)的時(shí)間。其他的方法運(yùn)行時(shí)間為線性。

        每個(gè)ArrayList 實(shí)例都有一個(gè)容量(Capacity),即用于存儲(chǔ)元素的數(shù)組的大小。這個(gè)容量可隨著不斷添加新元素而自動(dòng)增加,但是增長(zhǎng)算法并沒有定義。當(dāng)需要插入大量元素時(shí),在插入前可以調(diào)用ensureCapacity 方法來增加ArrayList 的容量以提高插入效率。

        LinkedList 實(shí)現(xiàn)了List 接口,允許null 元素。此外LinkedList提供額外的get,remove,insert 方法在LinkedList 的首部或尾部。這些操作使LinkedList 可被用作堆棧(stack),隊(duì)列(queue)或雙向隊(duì)列(deque)。

        注意,ArrayList 和LinkedList 都是線程不安全的。如果遇到多線程的環(huán)境,則必須自己實(shí)現(xiàn)訪問同步。例如:List list =Collections.synchronizedList(new LinkedList(...));

        Vector 也是List 接口的一個(gè)實(shí)現(xiàn)類,但是Vector 是線程安全的。

        Set 是Collection 的另一個(gè)子接口,它不允許放入重復(fù)的元素,即任意的兩個(gè)元素e1 和e2 都有e1.equals(e2)=false,關(guān)于null 元素,Set 接口的實(shí)現(xiàn)類也只能允許存入一次。

        Set 接口的典型實(shí)現(xiàn)類,有HashSet 和TreeSet。

        Map 也是一個(gè)接口,而且是需要重點(diǎn)強(qiáng)調(diào)的接口,它在實(shí)戰(zhàn)編程中使用的頻率非常高。Map 的特點(diǎn)是用鍵值對(duì)的形式來存放數(shù)據(jù),即Key-Value。其中,key 不能重復(fù),Value 可以重復(fù)。根據(jù)這一特點(diǎn),在實(shí)際編碼中,經(jīng)常用Map 來完成“以鍵查值”的情況。

        Map 接口有兩個(gè)典型的實(shí)現(xiàn)類,HashMap 和TreeMap。其中HashMap 的使用頻率更高一些。但HashMap 也是線程不安全的,如果涉及到并發(fā)編程,應(yīng)使用ConcurrentHashMap 代替。

        數(shù)據(jù)元素在內(nèi)存中的存放有兩種方式:

        順序存儲(chǔ)。相鄰的數(shù)據(jù)元素存放于相鄰的內(nèi)存地址中,整塊內(nèi)存地址是連續(xù)的。可以根據(jù)元素的位置直接計(jì)算出內(nèi)存地址,直接進(jìn)行讀取。讀取一個(gè)特定位置元素的平均時(shí)間復(fù)雜度為O(1)。基于數(shù)組實(shí)現(xiàn)的集合,才有這種特性。比如ArrayList。

        鏈?zhǔn)酱鎯?chǔ)。每一個(gè)數(shù)據(jù)元素,在內(nèi)存中都不要求處于相鄰的位置,每個(gè)數(shù)據(jù)元素包含它下一個(gè)元素的內(nèi)存地址。讀取一個(gè)特定位置元素的平均時(shí)間復(fù)雜度為O(n)。以鏈表為代表,比如LinkedList。

        在選擇容器類的時(shí)候,對(duì)容器類的遍歷,是一個(gè)重要的考慮因素。因?yàn)椴煌谋闅v方式,會(huì)給編碼帶來不一樣的難度,同時(shí)也會(huì)影響一些執(zhí)行效率。每一個(gè)具體實(shí)現(xiàn)的數(shù)據(jù)集合,一般都需要提供相應(yīng)的Iterator。相比于傳統(tǒng)for 循環(huán),Iterator 取締了顯式的遍歷計(jì)數(shù)器。所以基于順序存儲(chǔ)集合的Iterator 可以直接按位置訪問數(shù)據(jù)。而基于鏈?zhǔn)酱鎯?chǔ)集合的Iterator,正常的實(shí)現(xiàn),都是需要保存當(dāng)前遍歷的位置。然后根據(jù)當(dāng)前位置來向前或者向后移動(dòng)指針。

        迭代器是容器類對(duì)其數(shù)據(jù)通用的遍歷方式,除Set 接口下的容器必須是用迭代器遍歷之外,其他容器并不推薦使用這種方式。目前比較流行的是foreach 循環(huán),寫法簡(jiǎn)單,執(zhí)行起來也比較快。foreach內(nèi)部也是采用了Iterator 的方式實(shí)現(xiàn),只不過Java 編譯器幫我們生成了這些代碼。

        除foreach 循環(huán)之外,使用傳統(tǒng)的for 循環(huán)也是一種選擇,寫法上比foreach 循環(huán)稍麻煩一些。傳統(tǒng)的for 循環(huán)遍歷,基于計(jì)數(shù)器的。遍歷者自己在集合外部維護(hù)一個(gè)計(jì)數(shù)器,然后依次讀取每一個(gè)位置的元素,當(dāng)讀取到最后一個(gè)元素后,停止。主要就是需要按元素的位置來讀取元素。

        對(duì)于Map 的遍歷,首先可以獲取所有的key,按照key 來遍歷,也就是通過key 來尋找value。其次,也可以通過迭代器來遍歷,即申請(qǐng)一個(gè)Map 類型的Iterator,比如Iterator<Map.Entry<Integer,String>> it,然后去遍歷這個(gè)it。

        各遍歷方式的適用于什么場(chǎng)合?

        1、傳統(tǒng)的for 循環(huán)遍歷,基于計(jì)數(shù)器的:

        順序存儲(chǔ):讀取性能比較高。適用于遍歷順序存儲(chǔ)集合。

        鏈?zhǔn)酱鎯?chǔ):時(shí)間復(fù)雜度太大,不適用于遍歷鏈?zhǔn)酱鎯?chǔ)的集合。

        2、迭代器遍歷,Iterator:

        順序存儲(chǔ):如果不是太在意時(shí)間,可以使用此方式。

        鏈?zhǔn)酱鎯?chǔ):平均時(shí)間復(fù)雜度降為O(n),推薦此種方式。

        3、foreach 循環(huán)遍歷:

        foreach 只是讓代碼更加簡(jiǎn)潔了,但是他有一些缺點(diǎn),就是遍歷過程中不能操作數(shù)據(jù)集合(刪除等),所以有些場(chǎng)合不使用。

        猜你喜歡
        方法
        中醫(yī)特有的急救方法
        中老年保健(2021年9期)2021-08-24 03:52:04
        高中數(shù)學(xué)教學(xué)改革的方法
        化學(xué)反應(yīng)多變幻 “虛擬”方法幫大忙
        變快的方法
        兒童繪本(2020年5期)2020-04-07 17:46:30
        學(xué)習(xí)方法
        可能是方法不對(duì)
        用對(duì)方法才能瘦
        Coco薇(2016年2期)2016-03-22 02:42:52
        最有效的簡(jiǎn)單方法
        山東青年(2016年1期)2016-02-28 14:25:23
        四大方法 教你不再“坐以待病”!
        Coco薇(2015年1期)2015-08-13 02:47:34
        賺錢方法
        国产日产在线视频一区| 欧美激情中文字幕在线一区二区| h动漫尤物视频| 日韩在线视频专区九区| 无码喷潮a片无码高潮| 青青草97国产精品免费观看| 日韩AV有码无码一区二区三区| 国产一区二区三区资源在线观看| 粉嫩极品国产在线观看免费一区| 亚洲成在人网站天堂日本| 日本一二三区在线观看视频| 亚洲国产天堂一区二区三区| 91免费播放日韩一区二天天综合福利电影 | 亚洲啪av永久无码精品放毛片| 国产无码夜夜一区二区| 元码人妻精品一区二区三区9| 一区二区三区在线少妇| 性裸交a片一区二区三区| 国产手机在线αⅴ片无码| 偷柏自拍亚洲综合在线| 日韩精品久久中文字幕| 手机看片福利一区二区三区| 麻豆变态另类视频在线观看| 白白色发布视频在线播放| 欧美xxxxx在线观看| 人与嘼交av免费| 国产福利小视频91| 中文字幕乱码日本亚洲一区二区| 精品国产av色一区二区深夜久久| 98bb国产精品视频| 无码人妻中文中字幕一区二区| 一区二区三区中文字幕在线观看| 暖暖 免费 高清 日本 在线| 欧美日韩中文国产一区| 国产免费三级三级三级| 成人国产精品一区二区八戒网| 国产精品视频露脸| 国产亚洲精品福利在线| 96中文字幕一区二区| 欧美狠狠入鲁的视频777色| 正在播放亚洲一区|