Java-集合的简单介绍
上周極度頹廢,很咸魚,就沒有做開發(fā)學習的周記,這一周把Java核心技術卷I(除了swing等圖形界面一塊)看完了,然后開始看大話數據結構同時MOOC的數據結構也跟上,那就來總結總結Java里的集合這個和數據結構緊密聯系的東西。
1. Java集合框架
下圖來自Java核心技術卷I(第10版)
1.1 集合框架的接口
上面的類看起來非常之多但是你仔細看看后面的單詞末尾都會有一些相似的地方,Java的集合類庫將接口和實現分離。如果你有接口的概念,那么看看下面的圖可能就明白了。
上圖我們可以看到除了Iterator(迭代器)不屬于集合類的范疇外,所有的集合類都由兩個基本的接口:Collection和Map。1.2 Collection接口
這些方法非常好理解而且ArrayList里用過了很多,不多贅述。Tips:只研究藍色區(qū)域內的方法,默認方法不討論
1.2.1 迭代器
通過上圖的 iterator 方法來返回一個該集合的迭代器。 迭代器有什么用呢,我們來看看迭代器接口的方法
方法很少但是在Collection卻很重要。不多bb,上圖 所以我們有如下的使用方法 for(Iterable<T> element : c){// do something with element } 復制代碼將一個實現了Iterable接口的一個對象傳入進行遍歷,在這里這個對象就是我們說的實現了Collection接口的對象(因為Collection接口同時實現了Iterable接口) remove方法就是刪除 next 方法返回的對象
Tips: 不能連續(xù)使用兩次remove方法來實現連續(xù)刪除兩個元素,應該使用next方法后再remove
1.2.2 Collection子接口——List
List是一個有序的集合,訪問其中的元素既可以使用迭代器,也可以使用隨機訪問(即通過制定的索引訪問)
繼承自Collection接口,同時增添一些關于隨機訪問的方法 addAll(index:int, c:Collection<? extends E>):boolean get(index:int):E set(index:int, element:E):E add(index:int, element:E)void //...... 復制代碼經常使用ArrayList的同學肯定對這些方法不陌生。
1.2.3 Collection子接口——Set(集)
Set接口等同于Collection接口(沒有增添新的方法),不過集(Set)的add方法不允許添加重復的元素。
1.2.3 Collection的子接口——Queue(隊列)
首先我們來看看Queue接口中定義的方法
隊列是只允許在一端進行插入操作,而在另一端進行刪除操作的線性表。以下列出Queue新增的方法 offer(e:E):boolean//在隊列尾部添加一個元素 remove():E//刪除隊列的頭元素并返回,沒有則拋出NoSuchElementException異常 poll():E//刪除隊列的頭元素并返回,沒有則返回null element():E//返回隊列頭部元素,沒有則拋出NoSuchElementException異常 peek():E//返回隊列頭部元素,沒有則返回null 復制代碼1.3 Map 接口
這些方法和Collection不少有些相似,但是由于和Collection實現的方式有根本上的差異(1.4),所以總體來說還是很不一樣的所以分成了兩個接口。Tips:只研究藍色區(qū)域內的方法,默認方法不討論
1.3.1 Map子接口——SortedMap
SortedMap是一個可以保證按照鍵的升序排列的映射,可以按照鍵的自然順序(參見 Comparable 接口)進行排序, 或者通過創(chuàng)建有序映射時提供的比較器進行排序。 上圖:
1.4 Collection和Map實現的差異
Collection添加元素的時候一般只需要提供要傳入的元素,而Map是需要以鍵值對的方式(Key/Value)來添加的,一個Key對應一個Value。所以才導致了一些方法的不同
2. 具體的集合(Collection)
需要指出的是,我們現在所用的集合類都是繼承自Abstract+List/Set/Queue/Map抽象類而不是實現了某些接口,但是這些抽象類同樣實現了對應的接口,其實還是間接實現了對應的接口,但是使用繼承抽象類來實現集合類的話會比較方便。 下面介紹幾種常用的集合類,偏向介紹特性一些簡單的使用就忽略了。2.1 ArrayList
- 繼承自AbstractList
- 根據名字可以理解為一種常用的長度可變的數組(?)
- 也是使用的比較多一種集合,使用起來比較簡單,方便,不多贅述
2.2 LinkedList
- 繼承自AbstractSequentialList
- 實際上是一種雙向鏈表(參見 數據結構—鏈表)
在C++里我們通過不停地變換指針來到我們需要的節(jié)點然后進行增刪改查,在Java里,我們使用迭代器來進行增刪改查的操作。這里我們使用的迭代器不是原來我們介紹的迭代器,而是另一個,Iterator的子接口ListIterator。
其中有一個新的詞Previous(前者),對比next你就可以理解這些新的方法的含義。所以說Java中的鏈表默認是雙向的(你想自己實現一個單項的也行233333333) 簡答舉例就可以理解: List<String> food = new LinkedList<>();food.add("翅桶");food.add("春日全家桶");food.add("書亦燒仙草");ListIterator<String> listIterator = food.listIterator();listIterator.next();//翅桶listIterator.add("重慶雞公煲");//翅桶,重慶雞公煲,春日全家桶,書亦燒仙草listIterator.next();//春日全家桶listIterator.remove();//翅桶,重慶雞公煲,書亦燒仙草listIterator.previous();//重慶雞公煲 復制代碼2.3 ArrayDeque
- 繼承自AbstractCollection并實現了Deque接口
- 是一種用循環(huán)數組實現的雙端隊列 我們從方法名來看,并比對1.2.3的Deque(隊列)接口中的方法,不難看出它的使用方法。實際上就是一個可以從頭部添加或者刪除的隊列,但依然不允許從中間添加或者刪除元素,即使有迭代器,并有remove的方法,但是實際上依然remove方法依然是刪除頭部的元素: 同理,所有繼承自Collection的方法所對應的操作都是把它當做普通的隊列來操作。
2.4 HashSet
- 繼承自AbstractSet
- 用來存放沒有重復元素的無序集合
- 基于HashMap實現 巧妙的是,為了做到沒有重復元素,該集(Set)底層是通過新建一個HashMap并將元素當做HashMap的key的原理實現的,因為HashMap的key是獨一無二的。有關HashMap的描述,后面會講到。 無序集合采用迭代器的方式遍歷整個元素,無法決定順序,但是總會遍歷完所有的元素。
2.5 TreeSet
- 繼承自AbstractSet
- 用來存放沒有重復元素的有序集合
- 基于HashTree實現 first和last返回的是第一和最后一個元素 lower返回的是嚴格比給定元素要小的最大元素 floor返回的是比給定元素小于或等于的最大元素 higher返回的是嚴格比給定元素要大的最小元素 ceiling返回的是比給頂元素大于或者等于的最小元素 pollFirst/Last將集(Set)的頭部/尾部元素刪除(彈出)并返回 同樣是使用HashTree中的key值唯一性來保證沒有重復的元素。
3. 具體的映射(Map)
Tips:注意映射和集合
3.1 HashMap
- 繼承自AbstractMap
- 一種儲存鍵值對的無序數據結構 使用其實也非常容易理解,首先,他是無序的,迭代器訪問的時候也是隨機、無序的。往HashMap放一個值的時候就要把鍵(key)值(value)對都傳給put方法,想要訪問元素的時候呢就需要拿到他的key。還可以通過keySet方法和values方法單獨得到key和value的Collection對象。其中關于HashMap更多的細節(jié),我還不是特別清楚,以后會繼續(xù)討論√
- 對象和key必須是一一對應的,如果你想對自定義類放入HashMap,那你必須重寫hashCode方法來生成對象的key,還要重寫equals方法以保證兩個hashCode相等的對象返回的是false。
3.2 TreeMap
- 繼承自AbstractMap
- 一種儲存鍵值對的有序數據結構
- 排序的底層實現為紅黑樹(red-black tree) 使用起來和HashMap看起來差不多,區(qū)別就在于一個有序一個無序,迭代器總是能夠以排好的順序依次訪問元素。
3.總結
突然不想寫了,感覺寫這些簡單的沒什么深度,看了清夏學姐推薦的GitBook發(fā)現自己是真的弟。。。。。。 從今以后我寫的會更加注重深層次的東西,不在于多,而在于深。 不多bb,看書去了√
轉載于:https://juejin.im/post/5cb0cecc5188251ad87b1685
總結
以上是生活随笔為你收集整理的Java-集合的简单介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CentOS7+CDH5.14.0安装全
- 下一篇: Java程序员须知:分布式微服务为什么很