對象的集合
數組
數組標識符其實只是一個引用,指向在堆(heap)中創建的一個真實對象,這個(數組)對象用以保存指向其他對象的引用。
java.util. Arrays它有一套 static方法,提供操作數組的實用功能。
要保存基本類型,則只能用數組。
如果你復制對象數組,那么只是復制了引用——不會出現兩份對象的拷貝。這被稱作淺復制、淺拷貝(shallow copy)
Collection:一組獨立的元素,通常有某種規則應用于其上。List必須保持元素特定的順序,而 Set不能有重復元素。
Map:一組成對的鍵值對(key-value)對象。Map可以返回所有鍵組成的Set,所有值組成的 Collection,或其鍵值對組成的Set。
Java的容器類有兩種基本類型,區別在于容器中每個位置保存的元素個數。Collection每個位置只能保存一個元素。包括List,它以特定的順序保存一組元素;Set,元素不能重復。ArrayList 是一種List,而HashSet是一種Set。將元素添入任意Collection都可使用 add()方法。
Map保存的是鍵值對,(Map也被稱作關聯數組)使用方法put()為Map添加元素,它需要一個鍵與一個值作為參數。
Java容器的“缺點”,在將對象加入容器的時候就丟失了類型信息。容器只保存Object型的引用,這是所有類的基類,因此容器可以保存任何類型的對象。
將ArrayList看作是“能夠自動擴展的數組”。
迭代器是一個對象,它的工作是遍歷并選擇序列中的對象。
1. 使用方法iterator()要求容器返回一個Iterator。第一次調用Iterator的next()方法時,它返回序列的第一個元素。
2. 使用next()獲得序列中的下一個元素。
3. 使用hasNext()檢查序列中是否還有元素。
4. 使用remove()將上一次返回的元素從迭代器中移除。
點線方框表示接口,虛線方框表示抽象類,實線方框表示普通的(具體的)類。點線箭頭代表特定的類實現一個接口(若是抽象類,則表示部分實現了接口)。實線箭頭表示一個類可以生成箭頭所指向類的對象。
三種容器:Map,List和Set,它們各有兩到三個實現版本。常用的容器用黑色粗線框表示。
與持有對象有關的接口是Collection,List,Set和Map。
接口的優美之處(或者說目的)在于,如果你決定改變當前的實現,只需要在創建的位置做些修改即可。
List x = new LinkedList();
List x = new ArrayList();
典型情況是你會生成一個“具體類”的對象,然后將它向上轉型為對應的接口,在代碼中使用接口操作它。
Collection的功能方法:
可以通過Set或List執行的所有操作。
兩種List:一種是基本的ArrayList,允許對元素進行快速隨機訪問,但是向 List 中間插入與移除元素的速度很慢。ListIterator只應該用來由后向前遍歷ArrayList,而不是用來插入和移除元素,因為那比LinkedList開銷要大很多;另一種是更強大的LinkedList,對順序訪問進行了優化,向List中間插入與刪除的開銷并不大,隨機訪問則相對較慢。LinkedList 可以當作堆棧、隊列和雙向隊列使用。
次序是List最重要的特點;它保證維護元素特定的順序。一個List可以生成ListIterator,使用它可以從兩個方向遍歷List,也可以從List中間插入和移除元素。
Set具有與Collection完全一樣的接口,實際上Set就是Collection,只是行為不同。存入Set 的每個元素都必須是唯一的,因為Set不保存重復元素。加入Set的元素必須定義equals()方法以確保對象的唯一性。
HashSet為快速查找設計的Set。存入HashSet的對象必須定義hashCode()。
Set需要維護元素的存儲順序,這意味著你必須實現Comparable接口,并且定義compareTo()方法。