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


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);//自動裝箱:基本數據類型自動轉型為相對應引用數據類型                 //自動拆箱:是指有對應的基本數據類型的對象,自動轉型為其基本類型        

     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

下面是接口對應的各種關系


免責聲明!

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



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