黑馬程序員-java基礎-集合框架-Collection、List、Set

第一講:體系概述java

1、概述數組

一、  做用:用於存放對象的容器數據結構

二、  特色:只用於存儲對象,集合長度可變,集合能夠存儲不一樣類型的對象;函數

三、  與數組的區別:雖然數據也能夠存儲對象,但數組的長度是固定的,而集合長度是可變的,集合類的出現能夠解決現實生活中數量不肯定的問題;工具

四、  經常使用的集合類及結構線程

         

 

 

第二講:共性方法3d

集合實現了Collection接口,Collection接口聲明瞭以下經常使用方法:對象

1)  向集合中添加元素:add(Object obj)、addAll()blog

add()方法用於向集合中添加對象,實際添加的並非對象自己,而是將對象的地址添加到了集合中。以下:是將hello_一、hello_二、hello_3這三個字符串對象在堆內存中的地址添加給了ar1集合。繼承

總結:

  • add(Object obj)方法的參數是Object,以便於接收任意類型對象;
  • 集合中存儲的都是對象的引用或者地址;

 

2)  刪除集合中元素:remove(Object obj)

3)  判斷元素是否存在於集合中

4)  取兩個集合的交集:retainAll(Collection c)

ar1.retainAll(ar2); //獲取ar1和ar2中共同的元素,並最終賦給ar1。

5)  去掉交集:removeAll(),去掉兩個集合中的共同元素

ar1.removeAll(ar2); //去掉ar1中與ar2相同的元素。

 

 

第三講:迭代器

概念:定義在集合內部的,用於取出集合中的元素的方式;

       

定義迭代器來取集合中元素的緣由:不一樣的集合,數據存放的結構不一樣,取的動做細節也不一樣,所以,不能簡單的定義一個函數來讀取因此集合中的元素,須要根據不一樣集合的特性定義不一樣的元素讀取方法,這些方法被封裝在了集合的內部類中。當咱們須要調用集合的元素時,只需利用內部類對象來調用這些方法便可,而Collection接口爲因此繼承自Collection接口的集合提供了一個獲取內部類對象的方法:iterator()。

ar1.iterator()——獲取集合ar1的迭代器。

iterator()特性:該方法返回了迭代器(Iterator<E>接口)的對象,Iterator<E>接口中聲明瞭三個方法:

  • boolean hasNext()——判斷集合中是否仍有元素能夠迭代,是返回true,不然返回false;

ar1.hasNext()——判斷集合ar1中是否仍有元素和迭代。

  • E next()——返回迭代的下一個元素,即集合的下一個元素;

ar1.next()——返回ar1迭代的下一個元素。

  • Void remove()——從迭代器指向的collection中移除迭代器返回的最後一個元素(可操做)。

 

 

第四講:List集合共性方法

List和Set都是Collection下的類,二者的區別以下:

  • List:元素是有序的,元素能夠重複,由於該集合體繫有索引
  • Set:元素是無序的,元素不能夠重複

List特性:凡是能夠操做角標的方法都是該體系特有的方法;

List方法:

1)  增

add(index,element)——在指定位置添加元素

addAll(index,Collection)——在指定位置添加元素集

2)  刪

remove(index)——刪除指定位置的元素

3)  改

Set(index,element)——將指定位置元素替換成element

4)  查

Get(index)——獲取指定位置的元素;

subList(from,to)——獲取指定位置區間的元素

listIterator()——利用迭代器獲取元素

 

迭代器使用注意事項

在迭代過程當中,對集合元素進行添加或刪除操做時,不能同時使用迭代器和集合引用對集合元素進行添加或刪除操做,以下代碼會出現異常:

正確寫法以下:

第五講:ListIterator

概述:ListIterator是List集合特有的迭代器,是Iterator的子接口。

ListIterator的由來:在迭代時,一樣不能夠經過集合對象的方法操做集合中的元素,由於會發生ConcurrentModificationException異常。因此,在迭代時只能用迭代器的方式操做元素,但是Iterator中的方法是有限的,只能對集合中元素進行判斷、取出、刪除的操做,若是想要進行其餘的操做,如,添加、修改等,就須要定義Iterator的子接口,並在該接口中增長鬚要的方法,該自接口爲ListIterator。

獲取方法:該接口只能經過List集合的listIterator()方法獲取。使用實例以下:

 

第六講:List集合具體對象的特色

ArrayList底層的數據結構使用的是數組結構,特色:查詢速度快,但增刪稍慢,線程不一樣步,但java中給出了便捷的解決方案;

LinkedList底層使用的是鏈表數據結構,特色:增刪速度很快,但查詢稍慢;

Vector底層是數組數據結構,線程同步,已經被ArrayList替代。

 

第七講:Vector中的枚舉

Vector有一個特殊的取出元素方法:枚舉法Enumeration

枚舉法和迭代器很像,他們的功能是重複的。

由於枚舉法的名稱以及方法名稱都過長,因此就被後來的迭代器給取代了。枚舉法讀取元素方法以下:

第八講:LinkedList

一、LinkedList的特有方法:

添加:addFirst()、addLast()

獲取:getFirst()、getLast()——獲取元素,但不刪除元素。若是集合中沒有元素,會出現NoSuchElementException異常

刪除:removeFirst()、removeLast()——獲取元素,但元素被刪除。若是集合中沒有元素,會出現NoSuchElementException異常

 

二、JDK1.6出現替代方法,能夠避免因集合中沒有元素出現的異常

添加:offerFirst()、offerLast()

獲取:peekFirst()、peekLast()——獲取元素,但元素不被刪除。若是集合中沒有元素,會返回null,不會拋出異常;

刪除:pollFirst()、peekLast ()——獲取元素,但元素被刪除。若是集合中沒有元素,會返回null,不會拋出異常;

 

練習:使用LinkedList模擬一個堆棧或者隊列數據結構

堆棧:先進後出,如同一個杯子

隊列:先進先出,如同一個水管

思路:利用LinkedList數據結構特性,封裝一個符合本身要求的數據結構,這個數據結構向外提供添加、獲取、刪除等操做。

 

練習一:去除ArrayList集合中的重複元素

思路:建立一個新的集合,從老集合中讀取元素並添加到新集合中,並將新集合地址賦給老集合,在添加以前先判斷新集合中是否已經有此元素,如有,則不添加;不然添加。

練習二:將自定義對象做爲元素存到ArrayList集合中,並去除重複元素

一、思路:

1)描述一個對象,將數據封裝進這個對象中,以人爲例;

2)定義一個容器,將人存入;

3)去除重複的人——姓名、年齡都相同的爲同一我的;

         二、實現以下:

                 

         三、注意事項:

                   1)集合中remove(Object obj)方法的實現原理是:遍歷集合,查找要刪除的對象,過程須要調用equals方法進行判斷集合中是否存在要刪除的元素,所以,須要根據實際的狀況重寫equals。

                   2)集合中contains(Object obj)方法的實現原理:遍歷集合,調用equals方法進行判斷,集合中的元素是否存在和obj相同的元素,所以,須要根據實際的狀況重寫equals。

 

 

12  HashSet

Set元素是無序的(存入和取出的順序不必定一致),元素不能夠重複。在添加元素時,判斷集合中是否已經存在與此對象地址一致的,若存在,則比較他們的值是否一致,若一致,則不添加此元素;若不一致,則在同地址值下面添加新對象。

Set集合的功能和Collection是一致的。

一、 HashSet

底層數據結構是哈希表。HashSet保證元素惟一性的方法以下:

經過元素的兩個方法,hashCode和equals來完成。若是元素的HashCode值相同,纔會判斷equals是否爲true;若是元素的HashCode值不一樣,不會調用equals。

因此在自定義對象的時候,一般須要重寫hashCode和equals方法,重寫示例以下:

注意:對於判斷元素是否存在,以及操做,HashSet依賴的方法是元素的hashCode和equals;ArrayList依賴的只有equals。

 

小知識點總結

一、集合都有對集合中元素進行增、刪、改、查的方法,不一樣的集合子類還有各自不一樣的操做方法。如List的特有方法有:add(index,element)、remove(index)、Set(index,element)、Get(index)等。

二、迭代器

迭代器就像一個鏈接集合和外部的工具,用於外部讀取集合內部的元素。

它將讀取元素的具體細節動做封裝在集合內部,而給外部提供了共性的操做,即,獲取迭代器對象、調用方法讀取集合中的元素。

三、讀取集合中元素的方法有三種:

1)利用remove()方法遍歷集合中的元素

2)利用迭代器讀取元素

3)利用枚舉法讀取集合中的元素——僅限於Vector

四、使用ArrayList或LinkedList的情景判斷

當應用中須要頻繁查詢元素,但較少增刪元素時,建議使用ArrayList;當須要頻繁增刪操做,但較少查詢元素時,建議使用LinkedList;當既要頻繁查詢又要增刪元素時,建議使用ArrayList。

五、自定義數據結構

咱們能夠利用已有的數據結構來自定義本身須要的數據結構,自定義該數據結構的方法,以此來限制或擴展數據結構的特性。如自定義該數據結構的增、刪、改、查等功能。

相關文章
相關標籤/搜索