第一講:體系概述java
1、概述數組
一、 做用:用於存放對象的容器數據結構
二、 特色:只用於存儲對象,集合長度可變,集合能夠存儲不一樣類型的對象;函數
三、 與數組的區別:雖然數據也能夠存儲對象,但數組的長度是固定的,而集合長度是可變的,集合類的出現能夠解決現實生活中數量不肯定的問題;工具
四、 經常使用的集合類及結構線程
第二講:共性方法3d
集合實現了Collection接口,Collection接口聲明瞭以下經常使用方法:對象
1) 向集合中添加元素:add(Object obj)、addAll()blog
add()方法用於向集合中添加對象,實際添加的並非對象自己,而是將對象的地址添加到了集合中。以下:是將hello_一、hello_二、hello_3這三個字符串對象在堆內存中的地址添加給了ar1集合。繼承
總結:
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>接口中聲明瞭三個方法:
ar1.hasNext()——判斷集合ar1中是否仍有元素和迭代。
ar1.next()——返回ar1迭代的下一個元素。
第四講:List集合共性方法
List和Set都是Collection下的類,二者的區別以下:
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。
五、自定義數據結構
咱們能夠利用已有的數據結構來自定義本身須要的數據結構,自定義該數據結構的方法,以此來限制或擴展數據結構的特性。如自定義該數據結構的增、刪、改、查等功能。