java--集合框架總結1--set總結


一、集合框架的概述。

基礎的數據結構有數組,鏈表,棧,隊列,二叉樹等,java中的數據結構,利用了這些基本的數據結構分別實現了很豐富的集合框架類型,下面簡單地總結下關於java集合框架的基礎內容,在進行總結前,先大概看看java中主要的集合組織方式。

上面這張丑圖也基本上說明了集合框架之間的關系,下面首先對set進行簡單的總結,期間會稍微涉及到hashCode的一些其他知識。list和map的總結會在之后的博客中

二、 set:不可重復的數據存儲結構。

  1、hashSet:散列表,無序的數據存儲結構.簡單介紹下hashCode的概念:在Object中(如果該類沒有覆蓋hashCode()方法的話)表示某個對象內存的一個映射數字,通過該數字可以找到對應的對象內存塊,類似於數據庫中的索引的概念,當然有些類會重寫hashCode方法,例如字符串,基本類型的封裝類等。由於在集合類添加元素(包括但是不限於)等判斷兩個對象是否一樣時我們是利用equals方法比較的,入股equals的比較結果為true,則hashCode也必須相同,這里就要求equals重寫了則應該也要重寫hashCode,以保證他們的對應關系。

  知道了hashCode的概念后,我們就可以大概了解hashSet的原理了:hashSet通過hashCode建立一個索引表,用於儲存其內的所有對象的內存位置,add元素進來的時候,通過該表便可以快速地判斷元素是否在set內,在取元素的時候,也可以通過該表快速定位對象了,這樣可以保證其快速高效地添加和查詢元素。

  具體的set內部原理大概是這樣的:java中會將set的內部存儲機構分為多個鏈表(即鏈表數組)(我們下面稱這些鏈表為桶),在添加元素時,通過元素的hashCode和桶的個數取余,得到的余數表示了該對象需要裝到哪個桶中,只要保證桶數目夠多,便可快速定位到該對象所在的位置,當發生hashCode重復時,調用沖突解決算法:該算法將hashCode相同但是eauqls為false的方法放在一個單獨的鏈表中。具體請看下面的丑圖:

好了,上圖大概闡明了set的主要數據結構,歸根到底就是一句話:set是利用hashCode進行對象定位,利用鏈表數組進行存儲的數據結構!

  2、treeSet:樹狀的散列表(不知道這個描述是否准確)。treeSet,顧名思義,利用樹的結構實現的一種set數據結構。在treeSet中,它不像hashSet中的元素那樣元素毫無順序,treeSet是一種有序的數據結構。具體的數據結構示意圖就不畫出來了,因為挺好理解的。總的來說,treeSet和hashSet大體上只是數據存儲機構的不同,下面會對兩者進行對比的。

  3、treeSet VS hashTree:

    首先,hashTree既然包含數組機構,那肯定在所有桶數到達臨界點時,要進行大規模的擴桶操作,這樣毫無疑問會大大影響性能。當然,也正因為它的無序性和包含鏈表的部分特性(數組鏈表嘛),它的插入元素是非常快的(畢竟插入時不用重新排序嘛),另外,它的查詢操作速度上也還可以,畢竟它包含了一種數組的結構在里面(數組性質就是通過游標可以快速定位嘛);

    然后呢,再說treeSet吧,作為樹狀的結構,擴展時時不存在什么問題的,但是在插入元素的時候,顯然要重新排列數據,所以插入輸入肯定比不上hashSet的。當然,在查詢元素中,treeSet的速度可不是蓋的,畢竟人家是tree的結構(就算是簡單的二叉有序樹復雜度也只是logn)。

    總的來說:hashSet擴展性不好,但是查和插入(刪除也一樣)速度都不錯;treeSet擴展性不錯,查速度也不錯,就是插入會速度慢點。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM