摘要:迭代器通常被成為輕量級對象創建它的代價很小。與迭代器可以用于數組和所有對象,之所以能夠工作,是因為繼承了接口。
點擊進入我的博客
我覺得本章名字改成容器似乎更好理解,持有對象讓人感到一頭霧水
我們需要在任意時刻和任意位置創建任意數量的對象,所以依靠創建命名的引用來持有對象已經滿足不了需求。
Java可以用數組和其他容器類來(List、Set、Queue、Map)來解決這個問題,不同的容器類有各自的特性,滿足不同的需求。
Java SE5之前是沒有范型的,一個容器內(以List為例)可以放置任意的對象。
public class Test { // 用@SuppressWarnings抑制編譯器對“不受檢查的異常”的警告 @SuppressWarnings("unchecked") public static void main(String[] args) { // (1) List strList = new ArrayList() { { add("spidersama"); add(520); } }; // (2) for (Object obj : strList) { System.out.println(((String) obj).length()); } } }
如上所示,(1)處的代碼在編譯和運行的時候都沒有任何問題;但是當你在(2)處需要把Object類型強制轉型成你需要的對象類型的時候,這個時候就會出現問題,因為Integer是無法轉型成String類型的。
所以更安全的做法是,我們在創建一個容器的時候就明確它能存放的類型是什么List
編譯器將阻止我們放置其他類型的對象;
而且你在從容器中取出對象的時候,也不必在強制轉型,因為List知道你需要的對象類型是什么,它將會幫你自動轉型。
我們可以將聲明類型的子類放入該容器(即子類的向上轉型)。
11.2 基本概念Java容器類類庫的用途是“保存對象”,并將其劃分為兩個不同的概念。
Collection:一個獨立元素的序列。所有Collection都可以用foreach遍歷。
Map:一組成對的“鍵值對”對象,允許你使用鍵來查找值。
11.3 添加一組元素Arrays.asList();
Collections.addAll();
collection.addAll();
Collection的構造器可以接受一個Collection來初始化
Collectioncollection = new ArrayList<>(Arrays.asList(1, 2, 3)); collection.addAll(Arrays.asList(new Integer[]{1, 2, 3})); Arrays.asList(new int[]{1, 2, 3}); Arrays.asList(1, 2, 3); Collections.addAll(collection, new Integer[]{1, 2, 3}); Collections.addAll(collection, 1, 2, 3);
注意:Arrays.asList()返回的ArrayList不可以添加元素,此ArrayList和java.util.ArrayList不是同一個類。
11.4 容器的打印如果你要打印一個數組,需要用Arrays.toString()方法,直接打印數組顯示的是[I@61bbe9ba這種之前介紹過的格式。
容器由于重寫了toString()方法,所以可以直接打印出可讀性強的結果。
由于不同Collection或Map的子類元素放置的規則和順序不同,所以向容器內添加相同的元素,打印的結果不一定相同。
HashMap提供了最快的查找技術,沒有任何明顯的順序來保存其元素;TreeMap按照比較結果的升序保存鍵;LinkedHashMap按照插入順序保存鍵,同時還保留了HashMap的查詢速度。
11.5 ListList是一種可修改的序列,它允許在創建之后添加、移除元素,或者自我調整尺寸。
基本的ArrayList,它擅長隨機訪問元素,但是在List的中間插入和刪除元素時較慢
LinkedList,它通過代價較低的方式在List中進行插入和刪除操作,提供了優化的順序訪問;但是隨機訪問方面相對較慢。
迭代器是一個對象,他的工作是遍歷并選擇序列中的對象,而程序員不必知道該序列的底層結構,即將遍歷序列的操作和序列底層的結構分離。
迭代器通常被成為輕量級對象:創建它的代價很小。
Java的迭代器只能向前移動
使用方法iterator()要求容器返回一個Iterator,Iterator準備好返回序列的第一個元素
使用next()獲取序列中的下一個元素
使用hasNext()檢查序列中是否還有元素
使用remove()將迭代器新近返回的元素刪除
它是Iterator的子類型,只能用于List的訪問。
它可以雙向移動
它可以返回當前位置前一個元素和后一個元素的索引(即下標)
可使用時set()方法替換訪問過的最近的元素
可以使用listIterator(int index)直接創建一個指向索引處的ListIterator
11.7 LinkedList如前所述,LinkedList也像ArrayList一樣實現了基本的List接口,但是它執行插入和移除時比ArrayList要更高效,但是在隨機訪問操作方面要慢。
LinkedList還添加了可以使其用作棧、隊列或雙端隊列的方法(是Queue的子類)。
正是由于LinkedList添加了棧和隊列的方法,使得內部多了一些功能相同但名稱不同(為了覆蓋父類)的方法
getFirst() == element() ≈ peek():都是返回第一個元素,但是在空List的時候處理不一樣
removeFirst() == remove() ≈ poll():都是移除并返回列表的頭,但是在空List的時候處理不一樣
addFirst() == addLast():都將某個元素插入隊尾
11.8 Stack 棧棧是一種先進后出(Last In First Out,LIFO)的容器(數據結構)。
LinkedList能實現棧所有的功能。
peek():返回棧頂元素
pop():返回并移除棧頂元素
push():元素入棧
empty():棧是否為空
11.9 Set 集合Set不保存重復的元素。
Set與Collection有完全一樣的接口(方法),因此沒有任何額外的功能,實際上Set就是Collection只是行為不同(這就是繼承和多態思想的典型應用:體現不同的行為)。
HashSet:使用的是散列函數
TreeSet:將元素存儲在紅-黑樹數據結構中。TreeSet默認是按照字典序排序的;初始化TreeSet的時候可以設定排序的方式,如String.CASE_INSENSITIVE_ORDER就是按照字母序排列;你也可以寫一個你自己的比較器Comparator。
LinkedHashSet:是HashSet的擴展,但是元素順序是按照放插入順序保存的。
11.10 Map鍵值對
11.11 Queue 隊列隊列是一個典型的先進先出(First In First Out,FIFO)的容器。
隊列通常被當作一種可靠的將對象從程序的一個區域傳輸到另一個區域的途徑,尤其在并發編程中十分重要。
offer():將元素插入隊尾。
add():同offer(),但是當超出隊列長度當時候拋出異常。
peek():不移除的返回隊頭元素;為空時返回null。
element():同peek(),為空時拋出NoSuchElementException。
poll():移除并返回隊頭元素,為空時返回null。
remove():同poll(),為空時拋出NoSuchElementException異常。
11.11.1 PriorityQueue優先級隊列:按照優先級的順序維護的隊列。
當你在PriorityQueue上調用offer()方法來插入一個對象時,這個對象會在隊列中被排序。默認的排序將使用對象在隊列中自然順序,但是你可以通過提供自己的Comparator來修改這個順序。PriorityQueue可以確保當你調用相關方法時,獲取的元素將是隊列中優先級最高的元素。
Java中,實現Collection就必須提供iterator()方法,這有的時候會帶來麻煩。
直接生成Iterator是將隊列與消費隊列的方法鏈接在一起耦合度最小的方式,并且與實現Collection相比,它在序列類上所施加的約束也少得多。
foreach可以用于數組和所有Collection對象,之所以能夠工作,是因為Collection繼承了Iterable接口。
數組不是Iterable。
Iterable接口包含一個能夠產生Iterator的iterator()方法,并且Iterable接口被foreach用來在序列中移動。換言之,任何實現了Iterable接口的類,都可以用與foreach語法。
如果需要多個foreach遍歷一個類的方法,例如該類需要支持向前和向后遍歷。這是只實現Iterable是不行的,可以編寫其他返回類型為Iterable的方法來滿足foreach語句。這就是編寫適配器。
// 反向遍歷部分代碼 public class Test10.14 總結extends ArrayList { public Test(Collection extends E> c) { super(c); } public Iterable reverse() { return new Iterable () { @Override public Iterator iterator() { return new Iterator () { int index = size() - 1; @Override public boolean hasNext() { return index >= 0; } @Override public E next() { return get(index--); } }; } }; } }
數組將數字與對象聯系起來。
Collection保存單一的元素,而Map保存相關聯的鍵值對。
List也建立數字索引與對象的關聯,List能夠自動擴充容量。
如果要進行大量的隨機訪問,就使用ArrayList;如果要經常從表中間出入或刪除元素,則應該使用LinkedList。
各種Queue以及棧的行為,由LinkedList提供支持。
Map是一種將對象(而非數字)與對象相關聯的設計。HashMap設計用來快速訪問;而TreeMap保持“鍵”始終處于排序狀態,所以沒有HashMap快。LinkedHashMap保持元素插入的順序,但是也通過散列提供了快速訪問能力。
Set不接受重復元素。HashSet提供最快的查詢速度,而TreeSet保持元素處于排序狀態,LinkedHashSet以插入順序保存元素。
不要使用已過時的Vector、Hashtable和Stack。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/72195.html
摘要:前言編程思想這本書,陸陸續續讀了年,終于基本都瀏覽了一遍。每個對象對外暴露接口,程序通過對象暴露的接口向對象發送消息,獲取該對象的服務能力。異常處理異常處理,為編寫程序階段提供了一種預見性的防止程序崩潰的出路。 前言 《Java編程思想》這本書,陸陸續續讀了1年,終于基本都瀏覽了一遍。通過這本書,試圖理解作者的想法,才真的體會到Java思想。感謝本書的作者,不僅講述了java的語法,更...
摘要:方法接受一個對象,以及一個數組或是一個用逗號分隔的列表,并將元素添加到中。工作的很好,因為他從第一個參數中了解到了目標類型是什么。 ArrayList.asList() 接受一個數組或是用逗號分隔的元素列表,也可以用可變參數,然后將其轉為一個List對象。 Collections.addAll()方法接受一個Collection對象,以及一個數組或是一個用逗號分隔的列表,并將元素添加...
Java是面向對象的語言,對象時Java不可或缺的一個元素,基本數據類型有數組用來存儲,那么對象元素有什么存儲呢,這就是集合,集合是Java非常重要的一塊知識,Java編程思想中的持有對象簡述了集合的相關知識,下面簡述集合的相關功能: showImg(/img/bVC153); 集合類我們通常稱為容器 其實容器只有四種:Map、List、Set和Queue 常用的容器有ArrayList、Lin...
摘要:概述容器類類庫的用途是保存對象,它分為兩個不同的概念這是一個獨立的而序列必須按照插入的順序保存元素不能有重復元素按照排隊規則來確定對象產生的順序由鍵值對組成的,允許由鍵查找值,就像字典的目錄,根據目錄查找內容創建接口的不同形式對象時具體的, 概述 Java容器類類庫的用途是保存對象,它分為兩個不同的概念: Collection:這是一個獨立的而序列 List必須按照插入的順序保存...
摘要:層次結構如上所示,的子類都可以作為集合的元素加入到集合中,并且不會有任何影響。在實際編碼中一般都建議使用類型安全的容器,這樣不容易出錯,出錯也會在編譯期間就會展現出來。 概述 說起類型安全的容器,那么什么是類型不安全的容器呢?容器用來存儲數據,常見的存儲數據的容器有數組和集合,數組有以下特點: 長度固定 只能存儲同一種類型的數據 因為數組只能存儲同一種數據類型的數據,那么它就是類型...
閱讀 1317·2023-04-26 01:03
閱讀 1952·2021-11-23 09:51
閱讀 3318·2021-11-22 15:24
閱讀 2677·2021-09-22 15:18
閱讀 1024·2019-08-30 15:55
閱讀 3500·2019-08-30 15:54
閱讀 2270·2019-08-30 15:53
閱讀 2402·2019-08-30 15:44