JAVA基础之容器基础内容
Java Collections框架
Java Collections框架中包含了大量的集合接口以及這些接口的實現(xiàn)類和操作它們的方法,具體包含了Set(集合)、List(列表)、Map(鍵值對)、Queue(隊列)、Stack(棧)等,其中List、Set、Queue、Stack都繼承了Collection接口。我理解的容器就是類似于放不同奶茶的杯子的統(tǒng)稱,不同的實現(xiàn)類對應(yīng)了盛放不同奶茶需要不同的杯子,而我們不需要知道杯子是怎么構(gòu)造的,我們只需要知道什么奶茶需要什么杯子即可,而迭代器(Iterator)相當(dāng)于喝奶茶的吸管,拿到吸管我們不用了解奶茶的構(gòu)造,僅僅用吸管喝美味的奶茶就好。下面是Collection框架類圖:
最為主要的是三類:
- Set:集合,要求集合中的元素不相同,通過定義equals()函數(shù)來確保對對象的唯一性。
- List:有序的Collection,按照對象進(jìn)入的順序保存數(shù)據(jù),可以通過索引來讀取數(shù)據(jù)。
- Map:鍵值對,要求Key具有唯一性。其中HashMap通過散列表實現(xiàn),LinkedHashMap采用散列表來維持內(nèi)部的順序,TreeMap是基于紅黑樹的數(shù)據(jù)結(jié)構(gòu)來實現(xiàn)。
Iterator(迭代器)
用于遍歷以及選擇序列中的對象。就像上面所說的我們就像使用吸管一樣不必了解容器內(nèi)部構(gòu)造,就可以使用容器實現(xiàn)的迭代器遍歷容器的元素。包含最為主要的三個方法:
- 利用容器對象的Iterator()方法返回一個Iterator,使用next()返回第一個元素。
- hasNext() 判斷是否還有元素。
- remove()刪除迭代器返回的元素。
另外,在使用Iterator()遍歷容器時常常出現(xiàn)ConcurrentModificationException異常,主要是在使用迭代器遍歷容器時,進(jìn)行了容器的增加或者刪除操作,因為當(dāng)調(diào)用容器的Iterator() 方法時,會把容器包含的對象個數(shù)賦值給Iterator對象中的expectedModCount,在調(diào)用next() 方法時會比較當(dāng)前容器元素個數(shù)和expectedModCount,如果不相等拋出ConcurrentModificationException異常。解決的方法有:
- 在使用Iterator遍歷時,如果刪除或者增加的一個元素后即刻使用break跳出循環(huán)。
- 使用線程安全的容器:ConcurrentHashMap和CopyOnWriteArrayList。
- 在遍歷時使用一個容器將要刪除的對象保存,然后遍歷結(jié)束后使用removeAll()。
- 使用Iterator自帶的remove()方法刪除
- 把遍歷容器時對容器的操作放到synchronized代碼中。
同類容器之間的區(qū)別
ArrayList、Vector、LinkedList區(qū)別
三者都是可伸縮的數(shù)組,可以根據(jù)用戶的需求動態(tài)的變換數(shù)組的長度,很好的解決了固定長度數(shù)組構(gòu)造時需要指定固定的長度的問題。另外,它們有以下區(qū)別:
- ArrayList和Vector都是利用Object[] array實現(xiàn)的,都是順序存儲的,支持用下標(biāo)訪問元素。當(dāng)當(dāng)前容器容量不足時,動態(tài)擴充容量,Vector采用2倍擴容,而ArrayList采用1.5倍擴容(ArrayList源碼詳解),其中前者可以指定擴容因子,后者固定。另一個最大的區(qū)別,Vector是線程安全的,后者是線程不安全的。
- LinkedList是利用雙向列表實現(xiàn)的,對數(shù)據(jù)的索引需要從頭開始遍歷,效率較低,但是插入數(shù)據(jù)較快。
HashMap、HashTable、TreeMap以及WeakHashMap區(qū)別
- 對比HashMap和HashTable,前者是后者的輕量級實現(xiàn)即是非線程安全實現(xiàn),HashMap允許空鍵值存在,而HashTable不允許;HashMap去掉HashTable中contains方法,改為containsKey以及containsValue,另外前者是Map的一個實現(xiàn),而后者是Dictionary的一個實現(xiàn);Hashtable使用Enumeration,HashMap使用Iterator;對于擴容方式,HashTable默認(rèn)大小為11,擴容因子為old*2+1,HashMap默認(rèn)大小是16,擴容因子是2的指數(shù)。
- TreeMap實現(xiàn)了SortedMap接口,能夠按照指定的順序?qū)︽I值排序,因此取出的的鍵值是排完序的。
- WeakHashMap的key采用一種弱引用的方式,只要key不被外部引用,它就可以被gc回收,而HashMap則是key被刪除。
Collections工具類
- 針對Collection的一個包裝類,提供一系列的靜態(tài)方法來處理相應(yīng)的容器,服務(wù)于Collection框架中的各種類。
總結(jié)
以上是生活随笔為你收集整理的JAVA基础之容器基础内容的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于双线性插值的图像旋转原理及MATLA
- 下一篇: 英语笔记:写作:Nothing succ