做什么事情都要先明確其大綱
一:為什么會出現(xiàn)集合框架
由來:早期是沒有集合框架這一說的,因為當時有數(shù)組就可以了。但是隨著Java的發(fā)展與市場的不斷需
求,就出現(xiàn)了集合框架,比如數(shù)組時存儲基本數(shù)據(jù)類型的,當然也可以存儲自定義類型,但是其長度必
須是固定的,查詢刪除修改元素的時候,都必須通過角標。這就很不方便,為什么呢?因為你通過角操
作數(shù)據(jù),那么你怎么記著每個具體元素對應的角標呢?比如一個數(shù)組中有{d,b,t,g},等過段時間后,
你怎么知道t在數(shù)組中的那個問題呢?
所以Java在早期就出現(xiàn)了原始的集合Vector,由于早期注重的是安全,所以其為線程安全的。但是隨著
市場需求的不斷增多,效率就成了社會的主流,這時Vector就不能滿足需求,就需要有新的效率高的集
合來代替。這就出現(xiàn)了集合框架,根據(jù)面向對象的思想,不可能讓一個集合具有所有的優(yōu)點,因為這不
現(xiàn)實。 所以就出現(xiàn)了多個不同的集合,這些不同的集合都有各自的特點,但又有共同的方面,所以為
了讓他們有歸宿并且形成體系,就把他們共性的方面給抽取出來,形成他們的父類,讓特征不同的集合
繼承,這樣就有了集合框架。
二:集合框架與數(shù)組的區(qū)別:
1:最大的區(qū)別集合框架存儲的是引用數(shù)據(jù)類型,不能是基本數(shù)據(jù)類型
2:集合的長度是可變的,數(shù)組的是不可變的
三:集合框架的體系結構
Collection
List Vector Set
ArrayList LinkedList HashSet TreeSet
LinkedHashSet
四:看體系的方法:
要看一個體系,首先要看的就是他們的最底層,所以我們先看框架集合的祖宗Collection。。。。。。
1:Collection有什么特點
規(guī)律一:凡是祖宗一般其必為接口,遺憾的是Collection沒有逃脫這個規(guī)律,它也是接口。那么接下來
我們就要看這個接口(對象)
其特點:
1:長度可變(說明是數(shù)組)
2:元素可以重復(所以有角標),因此第三點可以不說
3:元素有角標
有哪些行為呢?
一個類(對象)中無非要么是方法(功能),要么是屬性,要么是二者都有。遺憾的是Collection只有
功能(方法),所以接下來看看它有
什么具體方法?
一個對象所具有的方法不過以下四類:增刪改查
1:增:
所以我們先看Collection的增加的方法,試想如果是自己定義,參數(shù)是什么,返回值是什么?
如果是我定義的,肯定需要參數(shù),沒有返回值。這是我初次的想法,但是如果添加不成功怎么辦?所以之
前的想法是錯的,必須有返回值但是返回值是什么類型的好呢?試想,如果是int型的,添加成功返回1,
不成功返回0,這可以。但是有另一種更加好的返回類型,boolean型,成功返回true,不成功返回false,
這也可以。
但為什么比int型更好呢?
因為我們有時候不必寫返回值true與false,比如 returna>b;如果成功,自己就可以返回true但是如果返
回的是int型,就需如下
if(a>b) return1;
else 0;
這樣寫不但代碼繁瑣而且格式不優(yōu)美,所以其add方法如下
booleanadd(E e);//添加單個元素到集合中
boolean add(Collection<? extendsT> c)//把一個集合中的元素添加到另外一個集合中
2:刪
刪除集合中的元素:
以為Collection補充了數(shù)組的不足,刪除元素通過對象,而不是角標返回值為boolean
boolean remove(Object o);
boolean revoveAll(Collection<?extends T> c);//查找并移除集合中相同的元素
void clear();
3:查:
boolean contains(Object o)//元素是否包含在指定集合中
boolean contionsAll(Collection<? extendsT> c);//參數(shù)集合是否包含的指定集合中
boolean isEmpty();//集合是否為空
boolean retaionAll(Collection<?extends T> c);//查找并保留相同的元素
4:取
如何的把集合中的元素全部的取出來,是非常重要的一個方面,但是Collection也為我們提供好了功能
其參數(shù)是什么呢?因為是取集合自身的元素,所以沒有參數(shù)。
但是返回值類型是什么呢?
因為每個子類的特點不一樣,所以他們存儲的數(shù)據(jù)也是不一樣的,所以導致他們的取出方式更是不一樣,
所以返回的應該是怎么去元素的那個對象,即迭代器Iterator iterator()
5:其它功能
由于數(shù)組胡集合有很多的相識型,所以集合就產生一個將集合轉為數(shù)據(jù)的方法返回值理應為Object型的數(shù)
組,不想要參數(shù),因為涉及到的只是自己在轉變,如何轉只有自己知道,所以無參 Object[]toArray();
但是總是返回Object型的數(shù)組總是不舒服的,因為有時候我們知道具體的返回值類型,所以方法如下
T[]toArray(T[] a);
注意:
在參數(shù)中可以指定數(shù)組的長度也可以不指定,如果指定的數(shù)組大小小于集合中的元素個數(shù),則會重新創(chuàng)建一
個默認的能裝下集合元素的數(shù)組
如果指定的數(shù)組大了,則多余的用null填充,
所以最好的是指定一個與集合元素個數(shù)相同的數(shù)
總結:
這些都是所有集合都具有的共性內容,所以下面看他下面的子類的特有功能吧。。。。。。。。
--------------------------------------------------------------------------------------------------
注意:Collection集合的特點之一就是元素有下標,但是我們在其具體的方法上并沒有看到太多使用下標的情
況。為什么呢?
因為它是集合框架的超級接口,它所有的是元素共有的方法。
因此,這些具體的方法都是在其子類里面,首先看一下他的第一個我們常用的子類
List集合:
1:List的由來:
list集合不幸的是也是一個接口,因為Collection的體系過于龐大,單靠Collection一個是沒辦法完成所有
公共
方法的抽取,所以出現(xiàn)了兩個子接口,而這兩個子接口的子類才是真正的執(zhí)行者
2:List的特點
1:有序集合(存取一致)
2:元素可以重復
3:每個元素都要角標(既可以通過角標也可以通過元素操作)
3:List的功能:
由于繼承的是Collection,所以除了擁有Collection中的方法外,還有自己特有的方法
1:增
boolean add(Object e);//原有的功能
void add(int index ,E element);//新功能
新的方法為什么沒有返回值呢?
說真的,它應該也有返回類型的,但是由于是后出來的,所以它的異常被封裝處理了,所以沒有返回值
類型
booleanaddAll(Collection<? extends T>);//原有功能
boolean addAll(intfrom,Collection<? extends T>t);//新功能更
不足之處:
我感覺它少封裝了一個方法,就是boolean addAll(int from,intto,Collection<? extends T> t)應該
是截取一個集合到另一個集合中
subList(intfrom,int to,Collection<? extends T>c);
2:刪;
boolean remove(E e);//原有方法
boolean remove(int index);//新方法
boolean removeAdd(Collection<?extends T> c);
void clear();
3:查
E get(int index);
int indexOf(Object o);
int lastIndexOf(Object o);
4:包含與判斷
boolean contains(Object c);
boolean containsAll(Collection<?extends T> c);
boolean isEmply();
int size();
5:取所有元素
1:父類中的方法(Itrator),在操作的時候,數(shù)組不能改變
2:特有方法
ListItrator在操作的時候,數(shù)組可以自由改變
List子類
List 有2個子類
1:首先看ArrayList這個子類
我們說過,只有到了List的子類,才可以知曉他們各自具有的特點,才可以說他們具體的用途,所以就讓
我們拭目以待吧
1:Arraylist特點
1:其內部封裝了一個可變長度的數(shù)組,默認大小為10
2:由于每個元素都有下標,所以查詢速度很快。
2:什么時候是使用?
當需要查詢數(shù)據(jù)的時候使用最好
2:LinkedList集合
有人會問,既然ArrayList那么的好用,為什么還要出現(xiàn)LinkedList呢?
因為ArrayList數(shù)組的長度是可變的,我們查詢的時候沒有問題,但是當我們重復的刪除添加一個元
素的時候,整個數(shù)組都在進行著重新的變動,這就又帶來了效率的下降,所以就出現(xiàn)了LinkedList,
所以我們來看其有什么特點吧
1:LinkedList特點
1:底層結構為鏈表結構,長度可變
2:由于是鏈表所以增加與刪除第一與最后一個的速度快
2:什么時候用呢?
當需要頻繁對元素進行增刪的時候用最好
3:剛才之所以沒有提ArrayLit的功能,主要是因為它繼承了父類中的,自己本身沒有什么特殊的方法,但
是LinkedList不同因為他又自己特有的方法,具體如下
1:刪除:
booleanremoveFirse();//有異常
boolean removeLast();
新的為
boolean pollFirst();
booleanpollFirst();//返回null,沒有異常
獲?。?/p> booleangetFirst();
boolean getLast();
新的為
boolean peekFirst();
boolean peekLast();
說完List,開始說SetSet與List一樣,也是Collection的子類,也是接口
set具有以下特點
1:元素無序
2:元素不重復
set及其子類沒有太多自己特有的方法,所以省略接下來重點看其子類
HashSet集合
1:特點:
1:底層是hash表結構,所以查詢速度比較快
2:元素不能重復
2:什么時候使用?
當元素無序且不重復的時候使用,這就是涉及到了一個問題,怎么判斷元素是否重復,怎么把重復的
元素過濾掉呢?
因為系統(tǒng)是根據(jù)hash算法算出每個元素的具體值,所以確保了元素的唯一性。但是萬一他們有相同的
hash值的時候,該怎么辦?
這時候就需要判斷他們的內容是否相同,如果2個值的hash值相同,但是內容不同他們也是不同的元
素,這時系統(tǒng)會根據(jù)別的條件重新算hash值。雖然底層的hash算法可以確保元素的唯一,但是其
equals方法卻不能,因為equals繼承的是Object的方法,其比較的是指針是否相 而不是內容是否相
同,所以我們在使用HashSet的時候,必須覆寫hashCode與equals方法。
如果HashCode值不同,則不判斷equals
如果hashCOde值相同,則判斷equals中內容是否相同,如果相同,則為同一個值,不同,則為不同的
值,存到集合中。
判斷兩個對象是否是同一個:Hashcode值與內容
3:如果我想讓存取是一致的,那么我們需要 HashSet的子類LinkHashSet
TreeSet集合
1:特點
1:底層是二叉樹結構
2:進行自然排序,所以存取的數(shù)據(jù)是有序的
2:什么時候使用?
當需要存入的數(shù)據(jù)是有序的時候使用
3:TreeSet實現(xiàn)排序的方式?
1:可以讓存入的元素自己具備排序功能,需要實現(xiàn)Comparable接口中的computo方法但是更多的時
候,要存入的元素不是我們寫的,而是別人寫好的,這時候我們要是先排序,該怎么辦呢?
這就有了第2中方式:傳入比較器
2:在TreeSet的構造方法中,可以通過傳入比較器來實現(xiàn)按指定的方式進行比較現(xiàn)比較器需要實現(xiàn)
comparator接口中未實現(xiàn)的方法即可
到此為止我把自己所理解的Collection集合已經詳細的總結完畢,望多多提出意見與建議。