在Java中,我們經常聽到Collections框架、Collection類以及Collections類。這三者名字相似,但是從概念上講卻是不同的。Collections框架泛指Java中用于存儲和操作集合的類庫總和,其中包括了List、Set和Map等。但是在具體實現(xiàn)上,由于Map中裝的是Key-Value的鍵值對元素,其接口形式和其他(比如List)接口不一樣,因此在Java中Map被區(qū)分對待了??偟膩砜?,位于Java Collections框架中最頂層的接口有兩個,Collection類和Map類,此時整個Java Collections框架的類層級如下:
Java中存在不少泛化的方法能夠直接對Collection接口進行操作,而不用關心具體的實現(xiàn)類是什么,比如在查找一個集合中的最大值元素的時候——即實現(xiàn)一個max()方法,此時我們并不需要知道這個集合具體的實現(xiàn)類是ArrayList還是HashSet,而只需要知道這是一個Collection集合即可。另外,這個max()方法對于所有具體實現(xiàn)類來說其實原理是一樣的,因此沒有必要讓每一個集合實現(xiàn)類自己再去實現(xiàn)一份?;诖?,Java引入了一個Collections工具類來輔助實現(xiàn)這些方法,比如操作集合和創(chuàng)建集合等。由于名字和Collection相似,Collections通常給程序員們帶來誤解,這一點需要注意。當然,Java 8中引入了“默認方法”(Default Method)的技術,使得理論上諸如max()這樣的方法可以直接實現(xiàn)在Collection接口上。
集合類的選用
在平時開發(fā)中,程序員們使用最多了莫過于ArrayList、HashSet和HashMap了。在多數情況下,這三個實現(xiàn)類已經能夠滿足我們的大部分需求,但是如果稍加分析我們可能會發(fā)現(xiàn)另外一些集合實現(xiàn)類能更好的滿足我們的需要。比如,當你需要一個有順序的Set時,可以考慮選用LinkedHashSet而不是HashSet。關于集合類是選用,可以參考下圖:
equals()和hashCode()方法