一、集合框架包含的主要內容及彼此之間的關係:java
圖1:程序員 |
![]() |
集合框架:是爲了表示和操做集合而統一規定的一種統一的標準體系結構。算法 包含三大塊的內容:對外的接口、接口的是實現和對集合運算的算法;數組 Java集合框架提供了一套性能優良、使用方便的接口和類,它們位於java.util包中:安全 ●接口:表示集合的抽象數據類型,在圖1中用虛線框表示,下圖綠色的:數據結構 ●實現:集合框架中接口的具體實現,圖1中一實線表示,粗實線表示經常使用的:上圖藍色的:多線程 ●算法:在一個實現了某個集合框架中的接口的對象身上完成某種有用的計算的方法;如:查詢、排序;框架 Java提供了進行集合操做的工具類Collections(相似於Arrays類):它提供了對集合進行排序、遍歷等多種算法實現;異步 |
二、java集合中的的兩大類接口:Collection和Map;函數
●Collection:Collection 接口存儲一組不惟一,無序的對象(List:不惟1、有序;Set:惟1、無序;因此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() |
今後映射中移除全部映射關係; |
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> |