使用Java實現物件導向程式設計——第六章 框架集合
1、集合框架包含的主要內容及彼此之間的關係:
圖1:
|
|
集合框架:是為了表示和操作集合而統一規定的一種統一的標準體系結構。 包含三大塊的內容:對外的介面、介面的是實現和對集合運算的演算法; Java集合框架提供了一套效能優良、使用方便的介面和類,它們位於java.util包中: ●介面:表示集合的抽象資料型別,在圖1中用虛線框表示,下圖綠色的:
●實現:集合框架中介面的具體實現,圖1中一實線表示,粗實線表示常用的:上圖藍色的: ●演算法:在一個實現了某個集合框架中的介面的物件身上完成某種有用的計算的方法;如:查詢、排序; Java提供了進行集合操作的工具類Collections(類似於Arrays類):它提供了對集合進行排序、遍歷等多種演算法實現; |
2、java集合中的的兩大類介面:Collection和Map;
●Collection:Collection 介面儲存一組不唯一,無序的物件(List:不唯一、有序;Set:唯一、無序;所以Collection介面是不唯一無序的);
●List:List 介面繼承Collection 介面,儲存一組不唯一(允許重複),有序(以插入的次序來放置元素,不會重寫排列)的物件;
●Set:Set 介面繼承Collection 介面,儲存一組唯一(不允許重複),無序的物件;
●Map:Map介面儲存一組鍵值物件,提供key到value的對映,Map中的Key不要求有序、不允許重複。value同樣不要求有序,但允許重複;
●Iterator(迭代器):介面是負責定義訪問和遍歷元素的介面;、
3、List介面:常用的類:ArrayList和LinkedList;(附加: Vector類:Vector集合類的使用(執行緒安全具有同步性),Stack類)
●ArrayList集合類對陣列進行了封裝,實現了長度可變的陣列,儲存資料的方式和陣列相同,都是在記憶體中分配連續的空間;
優點:在記憶體中分配連續的空間。遍歷元素和隨機訪問元素的效率比較高;
缺點:ArrayList類的使用無同步性,執行緒不安全;
●使用ArrayList儲存元素: ●使用ArrayList移除、判斷元素: |
|||
Eg:ArrayList集合的增刪查: |
|||
Pet類(父類):
|
Dog類(子類):
|
||
Test測試類:
|
遍歷方式1:(for)
遍歷方式2:(foreach)
|
||
新增元素:
|
按指定位置新增元素:
|
||
上面的程式碼的輸出結果:
|
|
||
刪除元素(按索引刪除):
結果:(與上面進行對比)
|
刪除元素(按物件刪除):
結果(與上面進行對比):
|
||
判斷物件是否存在:
|
輸出結果:
|
●List介面(ArrayList)常用方法:
方法名 |
說 明 |
boolean add(Object o) |
在列表的末尾順序新增元素,起始索引位置從0開始 |
void add(int index,Object o) |
在指定的索引位置新增元素。原索引位置及其後面的元素依次後移; 注意:新新增元素的索引位置必須介於0和列表中元素個數之間; |
int size() |
返回列表中的元素個數 |
Object get(int index) |
返回指定索引位置處的元素。 注意:取出的元素是Object型別,使用前需要進行強制型別轉換 |
boolean contains(Object o) |
判斷列表中是否存在指定元素 |
boolean remove(Object o) |
從列表中刪除元素 |
Object remove(int index) |
從列表中刪除指定位置元素,起始索引位置從0開始 |
●附加: ArrayList和Vector的區別:
相同點:ArrayList與Vector都是java的集合類,都可以用來存放java物件 |
不同點(如下): |
1、同步性: Vector是執行緒同步的。這個類中的一些方法保證了Vector中的物件是執行緒安全的。 ArrayList則是執行緒非同步的,因此ArrayList中的物件並不是執行緒安全的。因為同步的要求會影響執行的效率,所以如果你不需要執行緒安全的集合那麼使用ArrayList是一個很好的選擇,這樣可以避免由於同步帶來的不必要的效能開銷。 |
2、資料增長: 從內部實現機制來講ArrayList和Vector都是使用陣列(Array)來控制集合中的物件。當你向這兩種型別中增加元素的時候,如果元素的數目超出了內部陣列目前的長度它們都需要擴充套件內部陣列的長度,Vector預設情況下自動增長原來一倍的陣列長度,ArrayList是原來的50%,所以最後你獲得的這個集合所佔的空間總是比你實際需要的要大。所以如果你要在集合中儲存大量的資料那麼使用Vector有一些優勢,因為你可以通過設定集合的初始化大小來避免不必要的資源開銷。 |
●LinkedList採用連結串列儲存方式。它提供了額外的addFirst(),addLast(),removeFirst()和removeLast()等方法;這些方法使得該集合可被當作堆疊(stack)或列(queue)
優點:插入、刪除元素時效率比較高;
● 使用LinkedList儲存元素: |
|
Test測試類:(父類和子類見上面集合):
|
新增元素方式1:
新增元素方法2:
|
遍歷元素:
輸出結果:
|
訪問指定物件:
結果:
|
刪除指定物件:
結果:
|
刪除指定物件2:
結果:
|
●LinkedList的特殊方法:
方法名 |
說 明 |
void addFirst(Object o) |
在列表的首部新增元素 |
void addLast(Object o) |
在列表的末尾新增元素 |
Object getFirst() |
返回列表中的第一個元素 |
Object getLast() |
返回列表中的最後一個元素 |
Object removeFirst() |
刪除並返回列表中的第一個元素 |
Object removeLast() |
刪除並返回列表中的最後一個元素 |
4、Map介面:Map介面儲存一組鍵值物件,提供key到value的對映,Map中的Key不要求有序、不允許重複。value同樣不要求有序,但允許重複;
●HashMap集合類:
●使用HashMap儲存元素: |
|
Test測試類:(父類和子類見上面集合):
|
新增元素方式1:
通過key獲得值:
|
獲得元素的個數:
結果:
|
判斷key是否存在:
結果:
|
判斷key是否存在:
結果:
|
判斷值是否存在:
結果:
|
刪除指定元素:
清空元素:
結果:
|
顯示鍵值集合資料:
輸出結果:
|
迴圈遍歷key:
結果:
|
迴圈遍歷值:
結果:
|
●Map介面常用方法:
方法名 |
說 明 |
Object put(Object key, Object val) |
以“鍵-值對”的方式進行儲存 注意:鍵必須是唯一的,值可以重複,如果試圖新增重複的鍵,加入的鍵值對會替換原來的 |
Object get (Object key) |
根據鍵返回相關聯的值,如果不存在指定的鍵,返回null |
Object remove (Object key) |
刪除由指定的鍵對映的“鍵-值對” |
int size() |
返回元素個數(返回此對映中的鍵-值對映關係數。) |
Set keySet () |
返回鍵的集合 |
Collection values () |
返回值的集合 |
boolean containsKey (Object key) |
如果存在由指定的鍵對映的“鍵-值對”,返回true |
Boolean isEmpty() |
若不存在鍵值對關係,則返回true |
void clear() |
從此對映中移除所有對映關係; |
- ●Hashtable集合類:Hashtable集合類的使用(Hashtable具有同步性,執行緒安全);
- ●HashMap和Hashtable集合類對比:
HashMap和Hashtable的異同: ◆HashMap類出現之前,JDK中存在一個和它 同樣採用雜湊表儲存方式。同樣實現鍵值對映的集合類,HashMap,兩者實現原理相同,功能相同,很多情況下可以互用; |
|
HashMap和Hashtable的主要區別: ◆Hashtable繼承自Dictionary類,而HashMap是實現了Map介面,(是java 1.2引進的Map介面的一個實現。) ◆Hashtable是執行緒安全的,HashMap重速度輕安全,是執行緒非安全,所以當執行到多執行緒環境中時,需要程式設計師自己管理執行緒的同步問題; ◆HashMap可以讓你將空值作為一個表的條目的key或value但是Hashtable是不能放入空值的(null); ◆同步性:Hashtable是執行緒同步的。這個類中的一些方法保證了Hashtable中的物件是執行緒安全的。 HashMap則是執行緒非同步的,因此HashMap中的物件並不是執行緒安全的。因為同步的要求會影響執行的效率,所以如果你不需要執行緒安全的集合那麼使用HashMap是一個很好的選擇,這樣可以避免由於同步帶來的不必要的效能開銷,從而提高效率。 |
|
注意: 開發過程中,最好使用ArrayList和HashMap; |
5、迭代器(Iterator):
●java.util包中包含了一系列重要的集合類,集合類的根介面Collection。Collection介面是所有集合類的根型別。
●通過迭代器Iterator實現遍歷:
●獲取Iterator :Collection 介面的iterator()方法
●Iterator的方法
●boolean hasNext(): 判斷是否存在另一個可訪問的元素
●Object next(): 返回要訪問的下一個元素
★附加:每一種集合類返回的Iterator具體型別可能不同,Array可能返回ArrayIterator,Set可能返回SetIterator,Tree 可能返回TreeIterator,但是它們都實現了Iterator介面,因此,客戶端不關心到底是哪種Iterator,它只需要獲得這個 Iterator介面即可,
6、遍歷Map集合的方法:
●方法1:通過迭代器Iterator實現遍歷
|
●方法2:增強for迴圈
|
Test測試類:
|
向HashMap中新增元素:
遍歷方式2:(增強for):
輸出結果:
|
遍歷方式1:(迭代器)
|
輸出結果:
|
7、陣列和集合的區別:
●陣列可以儲存基本資料型別和物件,而集合中只能儲存物件(可以以包裝類形式儲存基本資料型別) ●陣列長度固定。集合長度可以動態改變; ●定義陣列時必須指定陣列元素型別,集合預設其中所有元素都是Object ●無法直接獲取陣列實際儲存的元素個數,length用來獲取陣列的長度,但可以通過size()方法直接獲取集合實際儲存的元素個數; ●集合有很多種實現方式和不用的使用場合,而不像陣列僅分配連續空間方式; ●集合以介面和類的形式存在,具有封裝、繼承和多型等類的特性,通過簡單的方法和屬性呼叫即可實現各種複雜操作,大大提高了軟體的開發效率; ●JDK中 有一個Arrays類,專門用來運算元組,它提供了一系列靜態方法實現,對陣列搜尋、排序、比較和填充等操作。 JDK中有一個Collections類,專門用來操作集合,它提供一系列靜態方法實現對各種集合的搜尋、複製、排序和執行緒安全化等操作; |
8、泛型(Generic)集合:
●泛型是java se1.5的新特性,泛型的本質是引數化型別,也就是說所操作的資料型別被指定為一個引數。這種引數型別可以用在類、介面和方法的建立中,分別稱為泛型類、泛型介面、泛型方法。
●在java se1.5之前,沒有泛型的情況下,通過對型別Object的引用來實現引數的“任意化”,“任意化”帶來的缺點是要做顯式的強制型別轉換,而這種轉換是要求開發者對實際引數型別可以預知的情況下進行的,對於強制型別轉換錯誤的情況,編譯器可能不提示錯誤,在執行的時候才出現異常,這是一個安全隱患。
●使用泛型有下面幾個優點:
1、型別安全
2、向後相容(泛型的好處是在編譯的時候檢查型別安全,並且所有的強制轉換都是自動和隱式的,提高程式碼的重用率)
3、層次清晰
4、效能較高,用GJ(泛型JAVA)編寫的程式碼可以為java編譯器和虛擬機器帶來更多的型別資訊,這些資訊對java程式做進一步優化提供條件。
Eg:ArrayList:
|
Eg:Map和Set:
|
|
List泛型集合: |
||
Test測試類:
|
新增元素:(向狗中新增企鵝會編譯錯誤):
|
|
移除指定元素:
|
|
|
Map: |
||
Test測試類:
|
新增元素:(向狗中新增企鵝會編譯錯誤):
|
|
遍歷:
|
|
9、如何選用集合類?
1、要求執行緒安全,使用Vector、Hashtable
2、不要求執行緒安全,使用ArrayList,LinkedList,HashMap
3、要求key和value鍵值,則使用HashMap,Hashtable
4、資料量很大,又要執行緒安全,則使用Vector
10、附加:
●Java中的Iterator(迭代器)的用法:
◆它的一個主要的介面方法是:
●boolean add(Object c)新增資料:add()方法將新增一個新元素。注意這個方法會返回一個boolean,但是返回值不是表示新增成功與否。
●Collection規定:如果一個集合拒絕新增這個元素,無論任何原因,都必須丟擲異常。
這個返回值表示的意義是add()方法執行後,集合的內容是否改變了(就是元素有無數量,位置等變化),這是由具體類實現的。即:如果方法出錯,總會丟擲異常;返回值僅僅表示該方法執行後這個Collection的內容有無變化。
▲類似還有:
boolean addall(Collection c);新增所有資料
boolean remove(Object o);刪除資料
boolean removeall(Collection c);刪除所有資料
boolean remainall(Collection c);保持所有資料
★Object[]toArray()方法很簡單,把集合轉換成陣列返回。Object[]toArray(Object[] a)方法就有點複雜了,首先,返回的Object[]仍然是把集合的所有元素變成陣列,但是型別和引數a的型別是相同的。
如:String[] o=(String)c.toArray(new String[0]); //得到的o實際型別是String[]陣列。
●其次,如果引數a的大小裝不下集合的所有元素,返回的將是一個新的陣列。如果引數a的大小能裝下集合的所有元素,則返回的還是a,但a的內容用集合的元素來填充。
尤其要注意的是,如果a的大小比集合元素的個數還多,a後面的部分全部被置為null(空)。
●Set結構的集合類:HashSet類,TreeSet類
◆HashSet是基於HashMap實現的,HashSet底層採用HashMap來儲存所有元素。hashCode和equal()是HashMap用的,因為無需排序所以只需要關注定位和唯一性即可;hashCode是用來計算hash值的,hash值是用來確定hash表索引的,hash表中的一個索引存放的是一張連結串列,所以還要通過equal方法迴圈比較鏈上的每一個物件才可以真正定位到鍵值對應的Entryput時,如果hash表中沒定定位到,就在連結串列前加一個Entry,如果定位到了,則更換Entry中的value(值)並返回value(值)
◆覆寫key的hashCode()和equal()時一定要注意,不要把它們和可變屬性關聯上,否則屬性變了之後hashCode會變,equal也會為false,這樣在Map中就找不到它了而且這樣的物件因為找不到它所以得不到釋放,這樣就變成了一個無效引用(相當於記憶體洩漏)
◆TreeSet集合類是一個有序集合,它的元素按照升序排序,預設是自然順序排列,也就是說TreeSet中的物件元素需要實現Comparable介面。TreeSet與HashSet類一樣沒有get()方法來獲取列表中的元素,所以也只能通過迭代器方法來獲取。由於TreeMap需要排序,所以需要一個Comparator為鍵值進行大小比較,當然也是用Comparator定位的Comparator可以在建立TreeMap時指定,這時排序時使用Comparator.compare如果建立時沒有指定Comparator那麼就會使用key.compareTo()方法,這就要求key必須實現Comparable介面
◆TreeMap是使用Tree資料結構實現的,所以使用compare介面就可以完成定位了。TreeSet是依靠TreeMap來實現的,TreeSet是一個有序集合,它的元素按照升序排列,預設是按照自然順序排列,也就是說TreeSet中的物件元素需要實現Comparable介面。TreeSet類中跟HashSet類一要也沒有get()方法來獲取列表中的元素,所以也只能通過迭代器的方法來獲取 。
◆HashSet與TreeSet集合類的區別:HashSet是基於hash演算法實現的,效能優於TreeSet。通常使用HashSet,在我們需要對其中元素排序的時候才使用TreeSet。
●Java中的List/Set和Map的區別:
★List按物件進入的順序儲存物件,不做排序和編輯操作。
★Set對每個物件只接受一次,並使用自己內部的排序方法(通常,你只關心某個元素是否屬於Set而不關心它的順序--否則使用List)。
★Map同樣對每個元素儲存一份,但這是基於"鍵"(key)的,Map也有內建的排序,因而不關心元素新增的順序。如果新增元素的順序對程式設計很重要,應該使用LinkedHashSet或者LinkedHashMap。
●List的功能方法:
實際上有兩種List:一種是基本的ArrayList其優點在於隨機訪問元素,另一種是更強大的LinkedList它並不是為快速隨機訪問設計的,而是具有一套更通用的方法。
★List:次序是List最重要的特點:它保證維護元素特定的順序。List為Collection新增了許多方法,使得能夠向List中間插入與移除元素(這隻推薦LinkedList使用)一個List可以生成Listlterator,使用它可以從兩個方向遍歷List,也可以從List中間插入和移除元素。
★ArrayList:由陣列實現的List。允許對元素進行快速隨機訪問,但是向List中間插入與移除元素的速率很慢。Listlterator只應該用來由後向前遍歷ArrayList。而不是用來插入和移除元素。因為那比LinkedList開銷要大很多。
★LinkedList:對順序訪問進行了優化,向List中間插入與刪除的開銷並不大。隨機訪問則相對較慢。
(使用ArrayList代替)還具有下列方法:addFirst(),addLast(),getFirst(),getLast(),removeFirst()和removeLast()
這些方法(沒有在任何介面或基類中定義過)使得LinkedList可以當作堆疊、佇列和雙向佇列使用。
●Set的功能方法:
★ Set具有與Collection完全一樣的介面,因此沒有任何額外的功能,不象前面有兩個不同的List。
實際上Set就是Collection,只是行為不同。(這是繼承與多型思想的典型應用:表現不同的行為。)Set不儲存重複的元素(至於如何判斷元素相同則較為負責)
★ Set:存入Set的每個元素都必須是唯一的,因為Set不儲存重複元素。加入Set的元素必需定義equals()方法以確保物件的唯一性。
Set與Collection有完全一樣的介面。Set介面不保證維護元素的次序。
★ HashSet:為快速查詢設計的Set。存入HashSet的物件必須定義hashCode()。
★ TreeSet:儲存次序的Set,底層為樹結構。使用它可以從Set中提取有序的序列。
★ LinkedHashSet:具有HashSet的查詢速度,且內部使用連結串列維護元素的順序(插入的次序)。於是在使用迭代器遍歷Set時,結果會按元素插入的次序顯示。
●Map的功能方法:
★方法put(Object key,Object value)新增一個"值"(想要得東西)和與"值"相關的"鍵"(key)(使用它來查詢)。
★方法get(Object key)返回與給定"鍵"相關聯的"值"。可以用containsKey()和containsValue()測試Map中是否包含某個"鍵"或"值"。標準的java類庫中包含了幾種不同的Map:HashMap,TreeMap,LinkedHashMap,WeakHashMap,ldentityHashMap。們都有同樣的基本介面Map,但是行為、效率、排序策略、儲存物件的生命週期和判定"鍵"等價的策略等各不相同。
★ 執行效率是Map的一個大問題。看看get()要做哪些事,就會明白為什麼在ArrayList中搜尋"鍵"是相當慢的。這正是HashMap提高速度的地方。HashMap使用了特殊的值,稱為"雜湊碼"(hash code),來取代對鍵的緩慢搜尋。"雜湊碼"是"相對唯一"用以代表物件的int值,它是通過將該物件的某些資訊進行轉換而生成的。所有java物件都能產生雜湊碼,因為hashCode()是定義在基類Object中的方法。
★ HashMap就是使用物件的hashCode()進行快速查詢的。此方法能夠顯著提高效能。
▲Map:維護"鍵值對"的關聯性,使你可通過"鍵"查詢"值"
▲ HashMap:Map基於雜湊表的實現。插入和查詢"鍵值對"的開銷是固定的。可以通過構造器設定容量capacity和負載因子load factor,以調整容器的效能。
▲ LinkedHashMap:類似於HashMap,但是迭代遍歷它時,取得"鍵值對"的順序是其插入次序,或者是最近最少使(LRU)的次序。
只能HashMap慢一點。而在迭代訪問時發而更快,因為它使用鍵表維護內部次序。
▲TreeMap:基於紅黑樹資料結果的實現。檢視"鍵"或"鍵值對"時,它們會被排序(次序由Comparabel或Comparator決定)。TreeMap的特點在於,
你得到的結果是經過排序的。TreeMap是唯一的帶有subMap()方法的Map,它可以返回一個子樹。
▲ WeakHashMap:旨鍵(weak key)Map,Map中使用的物件也被允許釋放:這是為解決特殊問題設計的。如果沒有map之外的引用指向某個"鍵",則此"鍵"可以被垃圾收集器回收。
▲ ldentifyHashMap:使用==代替equals()對"鍵"作比較的hash map。專為解決特殊問題而設計。
11、附加2:
●Java中Collections類完全由在 collection 上進行操作或返回 collection 的靜態方法組成。 它包含在 collection 上操作的多型演算法,即“包裝器”,包裝器返回由指定 collection 支援的新 collection,以及少數其他內容。 binarySearch()方法提供了多種過載形式,用於滿足各種型別陣列的查詢需要, binarySearch()有兩種引數型別此法為二分搜尋法(使用二分搜尋法搜尋指定列表), 故查詢前需要用sort()方法將陣列排序,如果陣列沒有排序,則結果是不確定的,另外如果陣列中含有多個指定值的元素,則無法保證找到的是哪一個。 |
|||||
●Collection和Map其中Collection介面又有眾多子介面,其中常用的有:List和Set,還有一些不常用的比如:Queue,Deque,NavigableSet,BeanContext,BeanContextServices,BlockingDeque,SortedSet |
|||||
●List和Set都是單列元素的集合,它們有一個共同的父介面Collection。 List內的元素講究有序性,內部元素可重複;但是Set恰恰相反,它講究的是無序性,元素不可重複。 Map與List和Set不同,它是雙列儲存的(鍵和值一一對應) |
|||||
●HashSet的儲存方式:雜湊儲存; |
|||||
●在Java集合框架中,有些類是執行緒同步安全的類,它們是Vector、Hashtable、Stack、enumeration。 除了這些之外,其他的都是非執行緒安全的類和介面。 執行緒安全類的方法是同步的,每次只能一個訪問,它們是重量級物件,效率較低。 對於非執行緒安全的類和介面,在多執行緒中需要程式設計師自己處理執行緒安全問題 |
|||||
●Java中的集合包括三大類,它們是Set、List和Map, 它們都處於java.util包中,Set、List和Map都是介面,它們有各自的實現類。 Set介面,無重無序; List介面允重有序,正好相反!Map介面包含鍵值對,值重鍵不重。 |
|||||
●Collections類的常用方法: java.util.Collections類包含很多有用的方法,可以使程式設計師的工作變得更加容易。常用方法有: 1) 使用sort()方法可以根據元素的自然順序 對指定列表按升序進行排序。 列表中的所有元素都必須實現 Comparable 介面。此列表內的所有元素都必須是使用指定比較器可相互比較的。 2) 使用shuffle()混排演算法所做的正好與 sort 相反。它打亂在一個 List 中可能有的任何排列的蹤跡。 也就是說,基於隨機源的輸入重排該 List, 這樣的排列具有相同的可能性(假設隨機源是公正的)。 3)使用reverse()方法可以根據元素的自然順序,對指定列表按降序進行排序。 4)使用swap()方法可以在指定列表的指定位置處交換元素。 |
|||||
●HashSet是Set介面的實現類,HashMap類是Map介面的實現類。ArrayList實現了長度可變的陣列,在記憶體中分配連續的空間。LinkedList採用連結串列儲存方式。TreeSet是Set介面的實現類,TreeMap類是Map介面的實現類。 |
|||||
●Collection類的常用方法: containsAll(Collection c)方法為判斷是否包含指定 collection 中的所有元素。 Remove(Object obj)方法為移除集合中某個元素。 注意:compareTO(Object obj)方法是在Comparable介面中定義的。 |
|||||
●Java中Collections類完全由在 collection 上進行操作或返回 collection 的靜態方法組成。 它包含在 collection 上操作的多型演算法,即“包裝器”,包裝器返回由指定 collection 支援的新 collection,以及少數其他內容。 因為Collections類提供的方法都是static的,所以可以直接呼叫執行,不需例項化物件。 |
|||||
●ArrayList類的常用方法。boolean add(E e) 該方法是將指定的元素新增到此列表的尾部。裡面元素可以重複. hashMap裡面鍵一樣的才會被覆蓋; |
|||||
●Java中,ArrayList提供了三種方式的構造器: 可以構造一個預設初始容量為10的空列表、構造一個指定初始容量的空列表,以及構造一個包含指定collection的元素的列表, 這些元素按照該collection的迭代器返回它們的順序排列的。 Eg:List al=new ArrayList(100);將會建立一個預計有100個元素的ArrayList物件a1; |
|||||
●Java的ArrayList類是傳說中的動態陣列,它實現了ICollection和IList介面,可以動態的增加和減少元素、靈活的設定陣列的大小。 ArrayList類的add()方法用於新增一個元素到當前列表的末尾。 |
|||||
Eg:
|
分析: Java 的ArrayList類有很多方法。 選項B的程式碼中ArrayList使用toArray()方法將list物件轉為Object[]陣列物件,但執行System.out.println(list.toArray())方法不能輸出展示list物件中的全部資料; 選項D的程式碼利用get(int index)方法獲得指定索引位置的資料,並呼叫的System.out.println()方法輸出該資料。 注意:本題要求列印出list中儲存的所有資料,不是指定的某個索引位置的資料。 因此,選項D的列印輸出結果不符合本題要求。本題應選擇AC。
|
||||
Eg:
|
分析: ArrayList集合中: 進行元素替換可使用set(int arg,Object o)的方法,set方法中倆個引數,第一個i是修改下標,第二個引數是修改的值。 也可以通過移除remove(int index)或者remov(Object o),然後新增add(Obeject o)的方式。remove()方法過載引數可以填值或者下標來移除元素,D項add()方法過載中一時新增的下標,2是新增的value值。 故BD可以實現修改修改元素 |
||||
Eg:
|
分析: peek()方法是返回但不刪除第一個元素, remove()方法是 返回並且刪除第一個元素, 所以呼叫這兩個方法後 ,列表中的值是“橙黃綠”答案C |
||||
●ArrayList,是可以改變大小的,我們稱之為容量capacity在ArrayList儲存成員達到增大的閥值時,會自動增加大小,其不指定時,預設大小為10。ArrayList不僅可以儲存null值,同時也可以儲存重複的值。 |
|||||
●Java的ArrayList類是傳說中的動態陣列,它實現了ICollection和IList介面,可以動態的增加和減少元素、靈活的設定陣列的大小。 ArrayList類的add()方法用於新增一個元素到當前列表的末尾,get()方法則是按照int型別的索引(從0開始計數)返回此列表中指定位置上的元素。 |
|||||
●LinkedList是實現List、Collection介面,是連結串列方式進行構建的,根據開發要求不同,可以使用LinkedList實現棧(先進先出)和堆(先進後出)這樣的資料結構。 |
|||||
●Java集合框架中,LinkedList類實現所有可選的列表操作,並且允許所有元素(包括 null)。 LinkedList常用方法:offer()是將指定元素新增到此列表的末尾(最後一個元素); pop()方法從此列表所表示的堆疊處彈出一個元素,即移除並返回此列表的第一個元素; offerFirst()方法是在此列表的開頭插入指定的元素; get()方法是返回此列表中指定位置處的元素。本題應選擇C。 注意:與offerFirst()方法對應的offerList()方法則是在此列表末尾插入指定的元素。 |
|||||
Eg:
|
分析: 該題使用HashMap儲存詩人資訊,主要考察的是HashMap的常用方法 1.Object map.get(Object key) 獲得與key(李白)相關的value(唐代大詩人) 2.boolean containsKey(Object key) 判斷map集合中是否存在key(李白):true 3.boolean containsValue(Object value) 判斷map集合中是否存在value(臺灣著名作家):true 4.int size() 返回集合中元素的數量:2 5.boolean isEmpty 判斷集合中是否存在元素(為空返回true,存在元素返回false): |
||||
Eg:
|
分析: 本題要從hMap中查詢得到value是“Oracle”的字串,要通過與之對應的key值"3"才能得到。 注意:put方法新增物件時key的值是字串"1"、"2"、"3"、"4",選項C的程式碼hMap.get(3)中引數是整數型別,而不是字串"3", Java的HashMap是Java Collection Framework 的重要成員,是 Map 介面的常用實現類。 對HashMap 而言,系統將 key-value 當成一個整體進行處理,根據 Hash 演算法來計算 key-value 的儲存位置,這樣可以保證能快速存、取 Map 的 key-value 對。 HashMap 採用一種所謂的“Hash 演算法”來決定每個元素的儲存位置。 當需要向HaspMap中新增物件時,程式執行該類的put()方法,系統將呼叫key值的 hashCode() 方法得到其 hashCode 值。得到這個物件的 hashCode 值之後,系統會根據該 hashCode 值來決定該元素的儲存位置。 而要獲取HaspMap中某個物件時,程式呼叫get()方法通過 key 取出對應 value 時,系統只要先計算出該 key 的 hashCode() 返回值,在根據該 hashCode 返回值找出該 key 在 table 陣列中的索引,然後取出該索引處的 Entry,最後返回該 key 對應的 value 即可。 |
||||
●HashMap類是基於雜湊表的 Map 介面的實現。它提供所有可選的對映操作,並允許使用 null 值和 null 鍵。但此類不保證對映的順序,特別是它不保證該順序恆久不變。 |
|||||
●HashMap 類是一個雜湊表,它儲存的內容是鍵值對(key-value)對映。 HashMap 繼承於AbstractMap,實現了Map、Cloneable、java.io.Serializable介面。 因為它屬於Map介面的類,所以實現了將唯一鍵對映到特定的值上。 同時,它的key、value都可以為null。所以,HashMap物件中最多隻有1個key值可以為null。 |
|||||
●Map將鍵對映到值的物件。一個對映不能包含重複的鍵;每個鍵最多隻能對映到一個值,在Java中Key的值重複,會預設覆蓋前一個。在C#會報錯。 |
|||||
●HashMap類和Hashtable類都是基於雜湊表的 Map 介面的實現。 Java集合框架中,有些類是執行緒同步安全的類,它們是Vector、Hashtable、Stack、enumeration。除了這些之外,其他的都是非執行緒安全的類和介面。 執行緒安全類的方法是同步的,每次只能一個訪問,它們是重量級物件,效率較低。 對於非執行緒安全的類和介面,在多執行緒中需要程式設計師自己處理執行緒安全問題。 Hashtable類的效能會低於HashMap類; |
|||||
●HashSet類是由雜湊表支援。它不保證 set 的迭代順序; 特別是它不保證該順序恆久不變。此類允許使用 null 元素。 HashSet類為基本操作提供了穩定效能,這些基本操作包括 add、remove、contains 和 size,假定雜湊函式將這些元素正確地分佈在桶中。 Java的HashMap和Hashtable都實現了Map介面。它們及其子類都採用Hash演算法決定Map中key的儲存。 HashMap和Hashtable的主要區別有:執行緒安全性,同步(synchronization),以及速度。 |
|||||
●關於迭代器,其中hasNext()方法是判斷是否有下一個元素,返回值為boolean, 而next()方法是獲取下一個元素,一般這兩個方法配合while迴圈一起使用! 遍歷ArrayList時,可以通過Iterator迭代器,itor.hasNext()表示還有沒有下一個集合元素,itor.next()取集合的下一個元素。 |
|||||
●Iterator介面描述的序列只能向後移動,這個從其提供的成員方法可以看出,next(),hasNext()。 其成員方法中,remove()是移出最後一個返回的序列成員。 next()是返回後一個序列成員(如果是第一次呼叫,則返回第一個成員), hasNext()表示是否還有序列成員。 |
|||||
●ListIterator介面的理解。Java中,除了具有Collection介面必備的iterator()方法外, List還提供listIterator()方法,返回一個 ListIterator介面。 作為ListIterator,ListIterator介面繼承了Iterator介面,是List的專門迭代器。 和標準的Iterator介面相比,ListIterator增加了hasPrevious()、prevoius()、add()三個方法,可以向前或向後遍歷資料,允許向List集合中新增資料。ListIterator介面的put()方法不能實現新增元素的功能個, |
|||||
LinkedList():
|
List<>:
|
List(註釋4會報錯)
|
TreeMap: |
||
Eg:
|
foreach訪問陣列:
|
||||
●泛型是Java SE 1.5的新特性,泛型的本質是引數化型別,也就是說所操作的資料型別被指定為一個引數。 這種引數型別可以用在類、介面和方法的建立中,分別稱為泛型類、泛型介面、泛型方法。 Java語言引入泛型的好處是安全簡單。 在Java SE 1.5之前,沒有泛型的情況的下,通過對型別Object的引用來實現引數的“任意化”,“任意化”帶來的缺點是要做顯式的強制型別轉換,而這種轉換是要求開發者對實際引數型別可以預知的情況下進行的。對於強制型別轉換錯誤的情況,編譯器可能不提示錯誤,在執行的時候才出現異常,這是一個安全隱患 泛型的好處是在編譯的時候檢查型別安全,並且所有的強制轉換都是自動和隱式的,提高程式碼的重用率。 如果一個類或介面上有一個或多個型別變數,那它就是泛型。型別變數由尖括號(“<>”)界定,放在類或介面名的後面。 |
|||||
●ava.util.Collections類包含很多有用的方法,可以使程式設計師的工作變得更加容易。 使用swap()方法可以在指定列表的指定位置處交換元素。 使用sort()方法可以根據元素的自然順序 對指定列表按升序進行排序。 |
|||||
●泛型一樣遵循多型,父引用指向子物件。 集合類都是泛型的,包括Iterator這個迭代器。 泛型是為了進行型別宣告是不確定,編譯時確定,從而簡化程式的一種方式,所以會進行型別的檢查。 泛型是能用盡可能使用-使程式更加健壯,避免執行時出現型別轉換錯誤給使用者帶來麻煩。 |
|||||
Eg:
|
分析: 本題考查泛型語句的語法。 Java的SortedSet是一個介面,其中的元素使用其自然順序進行排序,或者根據通常在建立有序 set 時提供的 Comparator 進行排序。 該 set 的迭代器將按元素升序進行遍歷。它提供了一些附加的操作來利用這種排序。 first()方法返回此 set 中當前第一個(最低)元素;tailSet()方法返回此 set 中大於等於指定的數值(方法的引數值)的所有元素。 對返回的set新增泛型時,應該在賦值運算子的左側限定泛型型別。因此,本題應選擇A。 |
||||
Eg:
|
分析: 這種引數型別可以用在類、介面和方法的建立中,分別稱為泛型類、泛型介面、泛型方法。 如果一個類或介面上有一個或多個型別變數,那它就是泛型。 型別變數由尖括號<>界定,放在類或介面名的後面。 本題要求建立一個只能存放String的泛型ArrayList的語句, 選項A則是建立了一個存放int型資料的ArrayList物件; 選項C的賦值運算子左側ArrayList類後面缺少<string>,存在語法錯誤; 選項D的賦值運算子左側是ArrayList類,但其右側是List介面,程式碼也有錯誤。本題應選擇B。</string> |
相關文章
- Go物件導向程式設計OOP的實現Go物件程式設計OOP
- java-物件導向程式設計--(3)Java物件程式設計
- 好程式設計師Java教程分享Java物件導向與程式導向程式設計師Java物件
- 物件導向程式設計物件程式設計
- JAVA_15 物件導向程式設計(下)Java物件程式設計
- java-物件導向程式設計--多型Java物件程式設計多型
- java-物件導向程式設計--繼承Java物件程式設計繼承
- Java--物件導向設計Java物件
- Python 物件導向程式設計Python物件程式設計
- 十三、物件導向程式設計物件程式設計
- Python物件導向程式設計Python物件程式設計
- 程式設計思想 物件導向程式設計物件
- js物件導向程式設計JS物件程式設計
- 十六、物件導向程式設計物件程式設計
- JS物件導向程式設計(一):物件JS物件程式設計
- 物件導向程式設計-java語言 第二週程式設計題物件程式設計Java
- 程式設計體系結構(06):Java物件導向程式設計Java物件
- 06 物件導向程式設計 (續)物件程式設計
- Python - 物件導向程式設計 - @propertyPython物件程式設計
- Python物件導向程式設計(1)Python物件程式設計
- Scala的物件導向程式設計物件程式設計
- Python - 物件導向程式設計 - super()Python物件程式設計
- JavaScript物件導向程式設計理解!JavaScript物件程式設計
- 物件導向程式設計C++物件程式設計C++
- Python OOP 物件導向程式設計PythonOOP物件程式設計
- python技能--物件導向程式設計Python物件程式設計
- javascript:物件導向的程式設計JavaScript物件程式設計
- JS物件導向的程式設計JS物件程式設計
- Javascript 物件導向程式設計(一)JavaScript物件程式設計
- Javascript 物件導向程式設計(二)JavaScript物件程式設計
- Javascript 物件導向程式設計(三)JavaScript物件程式設計
- 真的可以,用C語言實現物件導向程式設計OOPC語言物件程式設計OOP
- C++物件導向程式設計——遞迴實現字串的反序C++物件程式設計遞迴字串
- JavaScript-設計模式-物件導向程式設計JavaScript設計模式物件程式設計
- JavaScript設計模式之物件導向程式設計JavaScript設計模式物件程式設計
- Java——物件導向程式設計的一些總結Java物件程式設計
- 14 Python物件導向程式設計:反射Python物件程式設計反射
- python物件導向程式設計基礎Python物件程式設計