JAVA深刻回顧數據結構

首先的分析JAVA有什麼些數據類型:java

   一、常見的8大數據類型和數組跨域

    數組特色:連續的內存地址數組

    數組分爲:有序數組、無序數組安全

    有序數組:   工具

             檢索方式 : 單鏈、二分法、大數據

             特色:不可重複、 插入慢查找慢this

      無序數組:    code

             特色: 能夠重複對象

       詳細可參照:http://blog.jobbole.com/68023/blog

   存放數據:數組、集合

    通常狀況下,咱們放數據都是將數據放在容器(也就是集合裏面)裏面。

    那麼大多數集合是怎麼來得呢?那麼咱們看下底層代碼是怎麼實現的

    public ArrayList(int initialCapacity) {
        super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        this.elementData = new Object[initialCapacity];
     }

   從源碼裏面能夠看到,也就是說所謂的集合就是無限增加的數組。

   那麼集合就會存在如下幾個問題:

     一、檢索速度      二、安全性

   如下先介紹Collection接口  (整個集合的祖先、也是單列集合)

   在這個接口下面又作了一個set接口,和List接口

   那麼set接口 和List接口的區別:

         Set:檢索速度快,不能重複,無順序。。

         List:有下標,可存儲重複的值,檢索效率不高。又稱數組集合系列。

Set下面的操做類(經常使用的)

              HashSet、

              TreeSet

HashSet

          它每次存放數據,會獲得這個對象的hashcode值,而後拿到這個值除以一串數,按照這個除以以後的值放在Hashcode列裏面,當hashcode值相同的時候,會調用equals()方法。

               優勢:節約內存

          缺點:數據大檢索快。

 

TreeSet

           樹形的存放結構,查找速度也比較快

           數據查找相似於楊輝三角型,查找數據從上面,一個一個的比較下去。雖然查找數據相對於數組來講比較快,但數據很是大的時候,也不太妥。能夠想象Oracle裏面的表分區。

           缺點:費內存

           優勢:數據少比較快\自帶排序(彙集排序)。

           若是放的是對象(沒法天然排序),那麼就須要實現一個比較器以下:

            static class Dog implements java.lang.Comparable{

               public void CompareTo(){

                                  返回 1是大於。返回0是相同。返回-1是小於

                          }

              }

 

Set總結:

       add()的時候,先hashcode判斷,若是一致,在調用equals()方法。equals()返回爲false則添加進去。

也就是說HashSet根據這個hashcode的值,進行一個跨域,加快了檢索的速度。

 

List下面操做類(經常使用的)

        ArrayList

                    無同步

        Vector

                    與ArrayList方法相同,只是加上了同步關鍵字

 

        Stack

          內存結構:相似於彈夾,先進後出,子彈比如與數據。

         push()壓入數據

         pop()出棧

         peek();拿到棧頂的數據。

 

 

        LinkedList (鏈表集合)

                  一、單向鏈表

      內存結構:相似於一個盒子,有頭有尾,頭部爲值,尾部爲下一個數據的地址。

      存在BUG:從上往下找方便,可是從下往上找不到。

                  二、雙向鏈表

       內存結構:有頭,有身體,有尾巴。 頭部存儲上一個數據的內存地址,身體存放值,尾部存放下一個數據的地址。

 

    

        缺點:提取值比較慢。

        優勢:增加是無限的,刪除和修改是很是靈活。

鏈表集合用在發短信的地方比較多。

Iterator迭代器:

         每一個單列集合都定義了一個迭代器。由於無序集合不能按下標得值,因此須要迭代器拿值。

         hasNext()有對象嗎?             true表示有對象,false表示無對象。

         Next()獲得對象。            

 

Collections工具類

排序只針對List   若不是天然排序的對象,則須要實現比較器

Collections.sort();排序         Collections.reverse()逆排        

Map集合(雙列集合):

           Hashtable       

            不能夠 有null值,同步安全                 

源碼:

    public synchronized V put(K key, V value) {
        // Make sure the value is not null
        if (value == null) {
            throw new NullPointerException();
        }

        // Makes sure the key is not already in the hashtable.
        Entry tab[] = table;
        int hash = hash(key);
        int index = (hash & 0x7FFFFFFF) % tab.length;
        for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {
            if ((e.hash == hash) && e.key.equals(key)) {
                V old = e.value;
                e.value = value;
                return old;
            }
        }

        modCount++;
        if (count >= threshold) {
            // Rehash the table if the threshold is exceeded
            rehash();

            tab = table;
            hash = hash(key);
            index = (hash & 0x7FFFFFFF) % tab.length;
        }

        // Creates the new entry.
        Entry<K,V> e = tab[index];
        tab[index] = new Entry<>(hash, key, value, e);
        count++;
        return null;
    }

     也就是經過entrySet();拿到內部類,經過這個內部類取得key  value  

 

    HashMap

            能夠有null值,沒有同步

也就是說Map是構造一個內部類的對象的數組,這個對象存了當前的key,value等等。。。

相關文章
相關標籤/搜索