摘要:舉個栗子,常見的如迭代器用于遍歷容器,源碼如下常見用法存放獨立元素的序列。數據結構使用的是散列表,是最常用的是與同理,用于排序。所以當有其它線程改變了的結構增加或者移除元素,將會拋出,但迭代器本身的方法移除元素則不會拋出異常。
一圖勝千言
其中用綠色填充的為常用的類,需重點掌握。
Java容器的最上層都是以接口的形式出現,具體實現由子接口完成。舉個栗子,常見的如
MapIteratormap = new HashMap ();
迭代器,用于遍歷容器,JDK源碼如下:
package java.util; import java.util.function.Consumer; public interface Iterator{ boolean hasNext(); E next(); default void remove() { throw new UnsupportedOperationException("remove"); } default void forEachRemaining(Consumer super E> action) { Objects.requireNonNull(action); while (hasNext()) action.accept(next()); } }
常見用法:
Iterator iter = l.iterator(); while(iter.hasNext()){ String str = (String) iter.next(); System.out.println(str); }Collection
存放獨立元素的序列。Collection下又有三個子接口,List,Set,Queue。
一個有序的Collection(也稱序列),元素可以重復。確切的講,列表通常允許滿足 e1.equals(e2) 的元素對 e1 和 e2,并且如果列表本身允許 null 元素的話,通常它們允許多個 null 元素。實現List的有:ArrayList、LinkedList、Vector、Stack等。
一個不包括重復元素(包括可變對象)的Collection,是一種無序的集合。Set不包含滿 a.equals(b) 的元素對a和b,并且最多有一個null。實現Set的接口有:EnumSet、HashSet、TreeSet等。
一種隊列則是雙端隊列,支持在頭、尾兩端插入和移除元素,主要包括:ArrayDeque、LinkedBlockingDeque、LinkedList。另一種是阻塞式隊列,隊列滿了以后再插入元素則會拋出異常,主要包括ArrayBlockQueue、PriorityBlockingQueue、LinkedBlockingQueue。
Map存放key-value型的元素對。
常見容器與工具類 ArrayList數據結構采用的是線性表,優勢是訪問和查詢十分方便,但添加和刪除的時候效率很低。
LinkedList數據結構采用的是鏈表,優勢是刪除和添加的效率很高,但隨機訪問元素時效率較ArrayList類低。
HashSet數據結構采用的是散列表,主要是設計用來做高性能集運算的,例如對兩個集合求交集、并集、差集等。集合中包含一組不重復出現且無特性順序的元素。其值是不可重復與無序的。
TreeSet數據結構使用的是紅黑樹,性能上低于HashSet,用于排序。
HashMap數據結構使用的是散列表,是最常用的是Collection
TreeMap與TreeSet同理,用于排序。
Arrays、Collections這兩者可以理解成工具類,提供一些處理容器類靜態方法,比如二分查找,排序等等。
常見的容器比較 ArrayList VS VectorArrayList在內存不夠時默認是擴展50% + 1個,Vector是默認擴展1倍。
Vector提供indexOf(obj, start)接口,ArrayList沒有。
Vector屬于線程安全級別的,但是大多數情況下不使用Vector,因為線程安全需要更大的系統開銷。
沒特殊需求,一般用ArrayList
ArrayList VS LinkedList因為Array是基于索引(index)的數據結構,它使用索引在數組中搜索和讀取數據是很快的。Array獲取數據的時間復雜度是O(1),但是要刪除數據卻是開銷很大的,因為這需要重排數組中的所有數據。
相對于ArrayList,LinkedList插入是更快的。因為LinkedList不像ArrayList一樣,不需要改變數組的大小,也不需要在數組裝滿的時候要將所有的數據重新裝入一個新的數組,這是ArrayList最壞的一種情況,時間復雜度是O(n),而LinkedList中插入或刪除的時間復雜度僅為O(1)。ArrayList在插入數據時還需要更新索引(除了插入數組的尾部)。
類似于插入數據,刪除數據時,LinkedList也優于ArrayList。
LinkedList需要更多的內存,因為ArrayList的每個索引的位置是實際的數據,而LinkedList中的每個節點中存儲的是實際的數據和前后節點的位置。
HashTable VS HashMapHashMap幾乎可以等價于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受為null的鍵值(key)和值(value),而Hashtable則不行)。
HashMap是非synchronized,而Hashtable是synchronized,這意味著Hashtable是線程安全的,多個線程可以共享一個Hashtable;而如果沒有正確的同步的話,多個線程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的擴展性更好。
另一個區別是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以當有其它線程改變了HashMap的結構(增加或者移除元素),將會拋出ConcurrentModificationException,但迭代器本身的remove()方法移除元素則不會拋出ConcurrentModificationException異常。但這并不是一個一定發生的行為,要看JVM。這條同樣也是Enumeration和Iterator的區別。
由于Hashtable是線程安全的也是synchronized,所以在單線程環境下它比HashMap要慢。如果你不需要同步,只需要單一線程,那么使用HashMap性能要好過Hashtable。
HashMap不能保證隨著時間的推移Map中的元素次序是不變的。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64381.html
摘要:我的是忙碌的一年,從年初備戰實習春招,年三十都在死磕源碼,三月份經歷了阿里五次面試,四月順利收到實習。因為我心理很清楚,我的目標是阿里。所以在收到阿里之后的那晚,我重新規劃了接下來的學習計劃,將我的短期目標更新成拿下阿里轉正。 我的2017是忙碌的一年,從年初備戰實習春招,年三十都在死磕JDK源碼,三月份經歷了阿里五次面試,四月順利收到實習offer。然后五月懷著忐忑的心情開始了螞蟻金...
摘要:使用的好處知乎的回答不用自己組裝,拿來就用。統一配置,便于修改。 前言 只有光頭才能變強 回顧前面: 給女朋友講解什么是代理模式 包裝模式就是這么簡單啦 單例模式你會幾種寫法? 工廠模式理解了沒有? 在刷Spring書籍的時候花了點時間去學習了單例模式和工廠模式,總的來說還是非常值得的! 本來想的是刷完《Spring 實戰 (第4版)》和《精通Spring4.x 企業應用開發實戰》...
摘要:原文地址游客前言金三銀四,很多同學心里大概都準備著年后找工作或者跳槽。最近有很多同學都在交流群里求大廠面試題。 最近整理了一波面試題,包括安卓JAVA方面的,目前大廠還是以安卓源碼,算法,以及數據結構為主,有一些中小型公司也會問到混合開發的知識,至于我為什么傾向于混合開發,我的一句話就是走上編程之路,將來你要學不僅僅是這些,豐富自己方能與世接軌,做好全棧的裝備。 原文地址:游客kutd...
摘要:而調用后端服務就應用了的高級特分布式配置管理平臺后端掘金輕量的分布式配置管理平臺。關于網絡深度解讀后端掘金什么是網絡呢總的來說,網絡中的容器們可以相互通信,網絡外的又訪問不了這些容器。 在 Java 路上,我看過的一些書、源碼和框架(持續更新) - 后端 - 掘金簡書 占小狼轉載請注明原創出處,謝謝!如果讀完覺得有收獲的話,歡迎點贊加關注 物有本末,事有終始,知所先后,則近道矣 ......
閱讀 2609·2021-11-18 10:02
閱讀 2279·2021-09-30 09:47
閱讀 1745·2021-09-27 14:01
閱讀 3109·2021-08-16 11:00
閱讀 3163·2019-08-30 11:06
閱讀 2392·2019-08-29 17:29
閱讀 1532·2019-08-29 13:19
閱讀 445·2019-08-26 13:54