天天看點

簡單了解java容器類

今天看了java程式設計思想持有對象這一章,對java的容器類有了一定的了解,這裡寫出來分享給大家,一起學習,一起進步!

首先我們來看一張圖,摘自《java程式設計思想》,大家别怕,我會為大家一 一講解。

簡單了解java容器類

這張圖介紹的是java各個容器之間的關系,其實一般很多容器我們多沒用到過,我這邊主要講解幾個常用的的容器類,即上圖黑色方框表示的

為:ArrayList,LinkedList,HashSet,HashMap。

這裡我們先講跟Collection有關的幾個容器;

public interface Collection<E> extends Iterable<E>{};
 public interface List<E> extends Collection<E>{};
 public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{};
           

上面三行代碼是摘自jdk的源碼,對java有點基礎的同學應該可以看懂,首先Collection是一個接口,然後List也是一個接口,并且繼承了Collection接口,最後ArrayList實作了List接口,這與圖中所表示的内容一一對應,相信現在大家對它們的關系應該有點清晰了,是以LinkedList與HashSet是類似的,隻不過HashSet實作的是Set接口,既然它們都是實作Collection接口的實作類,那麼我們可以這麼建立Collection:

Collection <Object> c_ArrayList=new ArrayList<Object>();
   Collection <Object> c_LinkedList=new LinkedList<Object>();
   Collection <Object> c_HashSet=new HashSet<Object>();
           

這是java中的向上轉型,相信大家應該都了解吧,當然這裡不是講這部份内容,需要的了解的小夥伴可以自己去查下資料;

看到這裡很多小夥伴都疑惑了,既然它們都實作了Collection接口,為啥還要分成這麼多個,其實部落客一開始也很疑惑,不過現在也算有了基本的了解,部落客是個Meizu粉,這裡就以Meizu手機為例,Meizu為啥以前每年隻出一款手機,而現在卻每年出多款手機,并且有不同産品線,因為Meizu看到了使用者的不同需求,有部分使用者想要低價顔值高的産品,是以Meizu出了metal系列,有些使用者想要性能高點的産品,Meizu就出了MX系列,又有些使用者想要逼格高,與衆不同,Meizu就出了Pro系列,也許部落客比喻不當,其實它反映的卻是本質,開發者需求不同,是以java就給我們提供了不同的選擇,這就是為啥有不同的實作類了;

當然既然它們能抽象成一個接口,說明它們裡面肯定有相同或相似的内容,舉個例子:

int c_ArrayList_size=c_ArrayList.size();
   int c_LinkedList_size=c_LinkedList.size();
   int c_HashSet_size=c_HashSet.size();
           

我們發現其實每個集合都應該有傳回自身長度的函數,是以java的作者就幫這個函數抽象到Collection接口中,這符合了java面對對象中的一個原則,就是封裝。

ArrayList:它的底層是基于數組的,是以它的查詢是依靠索引的,查詢的時間複雜度是O(1),當然它的這種存儲方式也有一定弊端,那就是在插入和移除元素時較慢,因為在進行這些操作時,不止對目前元素進行操作,它還會對list中其他元素的位置有影響;

LinkedList:它的實作其實可以了解為c++中的雙向連結清單,這裡部落客就不展開講了,一是不是很精通,二是大家要學會自己去找新知識去學習,既然它是基于連結清單的,好處跟弊處就很明顯了,與ArrayList相比優勢在于在list中間進行插入和移除元素速度較快,當然它在随機通路速度上相對較慢,因為它需要周遊,是以時間複雜度為O(n),另外LinkedList通常用來實作資料結構,比如棧,隊列等;

HashSet:它的實作方式其實比較複雜,利用了很多哈希和散列的知識,這裡就不給大家講了,大家都懂的。。。,不過大家要知道它的一些特性,首先裡面的元素是無序,另外由于運用了hashCode()和 equal()等方法,其實也就是哈希的知識,是以它的查詢速度是很快的,時間複雜度是O(1)。

下面我列舉一些它們三個相對常用的方法:

簡單了解java容器類

以上的ArrayList的方法LinkedList都有,這裡就列舉幾個别的:

簡單了解java容器類

其他方法和HashSet的這裡我就不寫了,有興趣的小夥伴可以去看看java的api文檔,這裡給大家推薦個:java api文檔

以上就是部落客對Collection接口下的幾個容器類的了解了,大家有什麼意見多多提,一起互相學習;

下面我們來看一看HashMap的知識

首先我們先來看一看Map是什麼,Map是一種對象與對象相關聯的設計,展現的是一種映射關系,比如一個Map對象

map<String,String>,

其實它表示的是一個String對象對應另一個String對象,而Map中屬HashMap我們最常使用,是以我們一般可以這麼得到Map對象:

Map<String,Object> map=new HashMap<String,Object>();
           

和HashSet一樣HashMap的性能比較高,内部都用了散列碼的方式進行了存儲,主要是通過HashCode()函數,這裡我就不多講了,後面我會給大家寫一篇散列和關于HashCode()函數的文章,到時大家也可以去看看。

下面我為大家列幾個HashMap常用的函數:

簡單了解java容器類

寫了這麼多,總結一下,總的來說我這篇寫的是很淺的,簡單入門,更深的内容我會繼續探索,到時分享給大家,希望對大家有用!!!