JAVA集中中 List Set Map 區別和關係

來源:互聯網
上載者:User

標籤:

1List:List元素的特點!    

List集合的遍曆方式:         while-迭代器遍曆         for-迭代器遍曆         foreach-迭代遍曆         for-get遍曆(只有List才可以,set,map都不可以)

有序可重複,因為底層的實現數組和鏈表,都是有下標來表示唯一性的,存進去什麼順序,取出來還是什麼順序。

ArrayList : 底層是一個索引數組,有順序的,靠索引數組的下標

LinkedList: 底層是一個鏈表式的先後維持順序。

深入List集合

 ArrayList():底層是索引數組,索引下標        ArrayList集合底層預設初始化的容量是 10,擴大後容量是原始容量的1.5倍        Vector集合底層預設也是10,擴大後容量是原來的兩倍        ArrayListshi Vector 的升級,不要再用Vector        針對數組的代碼最佳化:盡量不要擴容操作,建立集合的時候,就初始化指定容量         List集合即可以有(迭代器-while迴圈,for-迭代器迴圈,for-get迴圈(只有list可以))

下面是個List例子供大家參考:

 

import java.util.*;

public class List01{    

  public static void main(String[] args){               

  List li = new ArrayList();                

  li.add(100);        

  li.add(10);        

  li.add(110);        

   li.add(100);

        for (Iterator it = li.iterator(); it.hasNext(); ){            

    System.out.println( it.next() );        

    }    

  }

}

2 ,Set:無順序不可重複:底層是一個索引數組。HashMap鍵的部分     HashSet:HashTable

    SortedSet:紅/黑樹狀結構 無序不可重複,但是存進去的元素可以按照元素大小自動排序

    SortedSet集合儲存元素為什麼可以自動排序        因為被儲存的元素實現了Comparable介面;    

       SUN編寫的的TreeSet集合在添加元素的時候,會自動調用CompareTo方法完成比

     Set集合:HashSet     1 HashSet 是HashMap的一個實現,本質就是一個HashMap,而HashMap的資料結構是一個Hash表

    2 雜湊表(Hash表):又叫散列表,其底層是用Hash函數組合起來的一個:數組和單向鏈表;每個單向鏈表表都有一個獨一無二的hash值,這個值同時也是數組的下標,每個單項列表節點的hash值是相等的;     hash值本質是把key的值調用hashCode()方法        3 向hash表中添加元素的過程            1) 先調用被儲存的key,調用hashCode方法,這個算出hash值,即數組的下標,然偶調用equals()方法,和數組的所有下標進行比對,如果沒有,就在新的桶位(就是下標位)建立鏈表               (如果不存在,則作為一個新的下標,添加一個數組元素,這個元素作為這個新的鏈表的頭元素存在)            如果有,則繼續調用equals()方法,把鍵和值和鏈表中的值進行比較,如果返回為true那麼,就代表該鏈表中已經有了這個key值,放棄添加,如果沒有,則返回false,然後連值一起放到當前的hash值鏈表中

     4 HashSet本質是hashMap的key部分,兩者完全一樣

     5 HashSet和HashMap初始化容量都是16,預設載入因子是0.75

下面是例子:

import java.util.*;

public class Collection_08_Set_01{    

  public static void main(String[] args){        

    Set s = new HashSet();

           s.add(1);//自動裝箱:基礎資料型別 (Elementary Data Type)自動轉型為相對應引用資料類型                 //自動拆箱:是指有對應的基礎資料型別 (Elementary Data Type)的對象,自動轉型為其基本類型        

     s.add(1);           

     s.add(3);        

     s.add(4);        

     Iterator it = s.iterator();        

     while (it.hasNext()){//hasNext()的傳回值是boolean (布爾值)           

     System.out.println( it.next() );        

}

        for (Iterator its = s.iterator(); its.hasNext(); ) {            

    System.out.println( its.next() );        

    }    

  }

}

3 Map:map無順序可重複

  hash(雜湊):根據對象的特性為對象產生一個唯一標示符的方法

  Oject中hashCode()是雜湊的一個應用,拿對象的記憶體位址經過運算來作為對象的唯一標示符

  HashMap:最底層還是個數組+單向鏈表:我們把下標是字串的數組叫關聯陣列

  數組的下標是一個字串

Map集合和Collection不一樣,但是操作是一樣的,只是操作的方法有細微的差別  增       Object put(Object key, Object value);       向集合中添加索引值對  刪         void clear(); 清空map  改       資料類型轉換  查       int size(); //擷取Map中索引值對的個數       boolean isEmpty();//判斷是否為空白       Object get(Object key);//通過key擷取對應對象的值       Collection values();//擷取map集合中所有value對象的集合       boolean:containsKey(Object key);//判斷集合中是否有這樣的key鍵       boolean containsValue(Object value)//判斷集合中是否有這樣的值       Set keySet();//擷取集合中所有的key,以集合方式返回       Set entrySet;//返回此映射中包含的映射關係,Set集合方式返回
      遍曆       HashMap預設初始值16,預設載入因子是0.75

下面是例子:

import java.util.*;

  public class Collection_06_Map_01{    

    public static void main(String[] args){        

      //1 建立一個HashMap的集合        

      Map ps = new HashMap();        

      //2 往裡面添加元素        

      ps.put("1000","jack");        

      ps.put("1011","jobs");        

      ps.put("1002","cook");        

      ps.put(1003,"rose");//這裡會調用Integer的hashCode()方法:1003.hashCode().hashCode(1003),return-->1003        

      ps.put("1000","sun");

           //查詢裡面的元素        

      System.out.println( ps.size() );//這裡的傳回值4 是指的是誰,有4個一一映射關係,一個一一映射關係在記憶體中就是一個鏈表節點        

      System.out.println( ps.containsKey("1004") );//查就是數組的下標,containsKey先是去調用對象的hashCode()產生hash碼,然後在調用對象自身的equals(),去數組下標中比較,然後在調用equals(),去鏈表中比對鍵的原值        

      System.out.println( ps.containsValue("sun") );//1 "1000"<----->"sun",一一映射,"sun"找到"1000"         //2 把"1000".hashCode().equals()去數組中比較下標(又叫桶位),找到這個桶位,然後         //3 "1000".equals()去鏈表中挨個比較         //4 "sun".equals()去比較他們的值//不需要比較         //有一句話:我們hash函數的目的,不是為了唯一性,不是為了產生唯一的hash碼,不同對象可以產生相同的hash碼,因為hash相同不相同對我們的這個一一映射關係沒有影響,對關係關係中的兩個值也沒有有影響.當我們去查詢值的時候,我們equals了三次,以是hash碼,第二次是key的原生值,第三步比較的是value的原生值         //所以:一個隱藏關係,鍵相等,值相等,那他們是不是就想等                 System.out.println( ps.get("1011") );

           //改        

      //遍曆:通過key遍曆集合,同時獲得元素的鍵和值        

      System.out.println( "---------" );        

      Collection values = ps.values();        

      Iterator it = values.iterator();        

      while (it.hasNext()){            

      System.out.println( it.next() );        

}        

      System.out.println( "---------" );

          //刪        

    System.out.println( ps.remove("1002") );         //資料類型轉換         //將Map轉換成Set集合        

    Set es = ps.entrySet();        

    Iterator it3 = es.iterator();        

    while (it3.hasNext()){            

      System.out.println( it3.next() );        

    }

     }

}

總結 :list 和set 有共同的父類 它們的用法也是一樣的 唯一的不太就是set中不能有相同的元素 list中可以
list和set的用途非常廣泛 list可以完全代替數組來使用
map 是獨立的合集 它使用索引值對的方式來儲存資料 鍵不能有重複的 值可以用
map不像上邊兩種集合那個用的廣泛 不過在servlet 和jsp中 map可是絕對的重中之重 頁面之間傳值全靠map

下面是介面對應的各種關係

JAVA集中中 List Set Map 區別和關係

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.