思考為什麼要引入容器這個概念?
Java有多種方式儲存對象(應該是對象的引用),例如使用數組,數組時儲存一組對象中的最有效的方式,如果你想儲存一組基本類型的資料,也推薦使用這種方式,但大家知道數組是具有固定尺寸的,你必須視線知道你要需要多少個對象。但是在一般的情況中,你在寫程式中并不知道将需要多少個對象,或者是否需要更加複雜的方式來存儲對象,是以數組尺寸固定很不爽!
為了解決上述問題,引入了容器的概念。容器提供了完善的方法來儲存對象,你可以使用這些工具來解決數量驚人的問題。Java日容器類可以自動調整自己的尺寸,是以與數組不同,你可以将任意數量的對象放到容器中,并不擔心容器設定為多大。
基本概念
java容器類庫用途是儲存對象。分為2類:
1. Collection
一個獨立元素的序列,這些元素都服從一條或多條規則。List必須按照插入的順序儲存元素,Set不能有重複元素。Queue按照排隊規則來确定對象産生的順序(通常與插入的順序相同)。
2. Map
一組成對的鍵值對對象,允許使用鍵來查找值,将數字和對象關聯到一起。映射表允許我們使用另一個對象來查找某個對象,也被稱為關聯數組或字典。Map很強大!
應盡量使用接口去聲明對象,例如使用List接口聲明對象:
List<Apple> apples = new ArrayList<Apple>();
而代替ArrayList<Apple> apples = new ArrayList<Apple>(); 因為你可以很友善的修改你的實作,就像下面這樣:
List<Apple> apples = new LinkedList<Apple>();
但是這種方法并總是好的,因為某些類有額外的功能,例如:LinkedList類具有在List接口中未包含的方法,而TreeMap類也具有在Map接口中未包含的方法。如果你們需要這些方法,就不能向上轉型成為更通用的接口。
建立出一個具體類的對象,将其轉型為對應的接口,在其餘的代碼中都使用這個接口。
***Arrays類 Collections類
包含一些常用的排序 查詢 轉換等靜态方法
class A{}
class AA1 extends A{}
class AA2 extends A{}
class AAA1 extends AA1{}
class AAA2 extends AA1{}
public class MyTest {
public static void main(String[] args) {
List<A> list1=Arrays. asList ( new AA1(), new AA2()); //right
List<A> list2= Arrays. asList ( new AAA1(), new AAA2()) ; //wrong
List<A> list3=Arrays.<A> asList ( new AAA1(), new AAA2()); //right
}
}
第二種asList,由于添加的是AAA1 AAA2對象,預設應為List<A1>,是以出錯,需在asList前聲明類型,但
List<A> list=Arrays. asList ( new AA1(), new AA2());
Collections. addAll (list, new AAA1(), new AAA1() );
Collections的addall方法正确,因為第一個參數說明了list的類型。
List接口在Collection的基礎上添加了大量的方法,使得可以在List中間插入和移除元素。
1 ArrayList和 LinkedList
都按照被插入的順序儲存元素,差別在于執行某些操作時的性能。且LinkedList包含的操作也多于ArrayList.
(1)ArrayList :長于随機通路元素,但是在List的中間插入和移除元素時較慢。
你可以把ArrayList 當做“可以自動擴充自身的數組”來看待,使用ArrayList也相當簡單:建立一個執行個體,用add()插入對象;然後用get()通路這些對象,此時需要索引,就像數組一樣,但是不需要方括号。ArrayList還有一個size()方法,使你知道有多少個元素添加進來,進而不會不小心因索引越界而引發錯誤。
(2)LinkedList:在List中間插入删除較快,提供優化的順序通路。随機通路時較慢,特性集較ArrayList 大。
各種Queue以及棧的行為,由LinkedList提供支援。
1.HashSet TreeSet LinkedHashSet
輸出顯示在Set中,每個相同的項隻儲存一次,但存儲的方式不同:
(1) Hashset存儲方式複雜,但保證了最快的擷取速度
(2)TreeSet按照升序儲存對象
(3)LinkedHashSet按照添加的順序儲存對象
可以使用鍵來查找對象,類似于數組下标。Map.put(key,value)插入資料,Map.get(key)查找資料。鍵要求唯一。存儲方式不是順序存儲,速度快。不必指定Map的尺寸,因為它自己會自動的調整。
(1)HashMap使用最快的查找技術,存儲無順序。
(2)TreeMap按照比較結果升序儲存。
(3)LinkedHashMap按照插入順序儲存鍵,同時保留HashMap的查詢速度。
容器缺點:使用容器,必須對容器的确切類型進行程式設計,但若像更換或擴充至其他容器,必須重寫代碼。疊代器可以解決這個問題,實作代碼的重用。它是一個對象,它的工作是周遊并選擇序列中的對象,而用戶端程式員不必知道或關心該序列底層的結構。它是輕量級對象,建立的代價小。
是以經常對疊代器有些奇怪的限制:
1)使用方法Iterator()要求容器傳回一個Iterator。Iterator将準備好傳回序列中的第一個元素。
2)使用next()獲得序列的下一個元素。
3)使用hasNext()檢查序列中是否還有元素。
4)使用remove()将疊代器新近傳回的元素删除。
疊代器能夠将周遊序列的操作與序列底層的結構分離,它統一了對容器的通路方式,這是它的威力所在。
先進先出容器,是區域之間傳輸對象的可靠的途徑,在并發程式設計中尤為重要。
PriorityQueue確定調用peek() poll() remove() 時,擷取的元素是隊列中優先級最高的元素。即可以對隊列中的元素進行排序操作。
都可以實作與底層容器的解耦。Collection可以使用foreach,看起來更清晰,但必須實作Collection接口中的方法,如果選擇繼承 AbstractCollection類,仍必須實作iterator方法和size方法。而在類内部使用Iterator則可以避免以上不足,是将隊列 和消費隊列的方法連接配接在一起耦合度最小的方式。
實作了Iterable接口的類,都可以被用在foreach中。數組到Iterable之間必須進行顯式轉換。
Face your past without regret. Handle your present with confidence.Prepare for future without fear. keep the faith and drop the fear. 面對過去無怨無悔,把握現在充滿信心,備戰未來無所畏懼。保持信念,克服恐懼!一點一滴的積累,一點一滴的沉澱,學技術需要不斷的積澱!