1. 程式人生 > >Java集合-Map(簡單概述和案例)

Java集合-Map(簡單概述和案例)

Map
    Map和Collection儲存資料的形式不同
        Collection中的集合,元素時孤立存在的(理解為單身),想集合中儲存元素採用一個個元素的方式儲存。
        Map中的集合,元素是成對存在的。每個元素由鍵和值兩部分組成,通過鍵可以找所對應的值。
        Collection中的集合稱為單列集合,Map中的集合稱為雙列集合。
        需要注意的是,Map中的集合不能包含重複的鍵,值可以重複;每個鍵只能對應一個值。


        HashMap<K, V>:儲存資料採用的雜湊表結構,元素的存取順序不能保證一致。
        由於要保證鍵的唯一,不重複,需要重寫鍵的hashCode()和equals()方法。

        LinkedHashMap<K, V>:HashMap下有個子類LinkedHashMap,儲存資料採用的雜湊表和連結串列結構。
        通過連結串列結構可以保證元素的存取順序一致。
        由於要保證鍵的唯一,不重複,需要重寫鍵的hashCode()和equals()方法。

        public class MapDemo{
            psvm{

            }
            /*
            移除集合中的鍵值對,返回被移除之前的值
            V remove(K)
            */
            public static void func3(){
                psvm{
                    Map<Integer, String> map = new HashMap<Integer, String>();
                    map.put(1,"a");
                    map.put(2,"d");
                    map.put(3,"c");

                    String value = map.remove(3);
                    sout(value);

                    String value = map.remove(4);
                    sout(value);    //返回null,並且沒有移除成功
                }
            }

            /*
            通過鍵物件,獲取值物件
            V get(K)
            */
            public static void func2(){
                psvm{
                    Map<Integer, String> map = new HashMap<Integer, String>();
                    map.put(1,"a");
                    map.put(2,"d");
                    map.put(3,"c");

                    String value = map.get(1);
                    sout(value);

                    String value = map.get(4);
                    sout(value);    //結果為null
                }
            }

            /*
            將鍵值對儲存到集合中
            V put(K, V)
            */
            public static void func(){
                //建立集合物件,hashmap
                Map<String, Integer> map = new HashMap<String, Integer>();
                map.put("a",1);
                map.put("b",2);
                map.put("c",3);
                map.put("c",5);        //重複的鍵會把原來的值覆蓋掉,不允許出現重複鍵

                Integer i= map.put("d",6);    
                sout(i);    //返回值一般情況下返回null,儲存重複鍵的時候,返回被覆蓋之前的值

                sout(map);
            }
        }

    Map集合的遍歷
        利用鍵獲取值
        Map介面中定義方法keySet
        所有的鍵,儲存到Set集合

        public class MapDemo1(){
            psvm{
                //1、利用Map集合的方法keySet,所有的鍵儲存到Set集合中
                //2、遍歷Set集合,獲取出Set集合中的所有元素(Map中的鍵)
                //3、呼叫map集合方法get,通過鍵獲取到值

                Map<String, Integer> map = new HashMap<String, Integer>();
                map.put("a",1);
                map.put("b",2);
                map.put("c",3);

                Set<String> set = map.keySet();
                //此Set是HashMap中的內部類KeySet

                //1
                Iterator<String> it = set.iterator();
                while(it.hasNext()){
                    sout(map.get(it.next()));
                }

                //2
                for(String key : set){
                    sout(map.get(key));
                }

                //3
                for(String key : map.keySet()){
                    sout(map.get(key));
                }


            }
        }

    Map中的Entry物件
        /*
        Map集合獲取方式
        entrySet方法,鍵值對對映關係(結婚證)獲取
        實現步驟:    
            1、呼叫map集合方法entrySet()將集合中的對映關係物件,儲存到Set集合
                Set<Entry<K, V>>
            2、迭代Set集合
            3、獲取出的Set結合的元素,是對映關係物件
            4、通過對映關係物件方法getKey,getValue獲取鍵值對
        */
        public class MapDemo2(){
            psvm{
                Map<Integer, String> map = new HashMap<Integer, String>();
                map.put(1, "a");
                map.put(2, "b");
                map.put(3, "c");

                Set<Map.Entry<Integer, String>> set = map.entrySet();

                Iterator<Map.Entry<Integer, String>> it = set.iterator();
                while(it.hasNext()){
                    Map.Entry<Integer, String> entry = it.next();
                    sout(entry.getKey()+"...."+entry.getValue());
                }

                for(Map.Entry<Integer, String> entry : map.entrySet()){
                    sout(entry.getKey()+"...."+entry.getValue());
                }

            }

        注意:Iterable 介面下沒有map集合,所以map不能用增強for迴圈


    HashMap
        /*
        利用HashMap集合,儲存自定義的物件
        自定義物件,作為鍵出現,作為值出現
        */
        public class HashMapDemo{
            psvm{

            }
            /*
            HashMap儲存自定義的物件Person,作為值出現
            */
            public static void func(){
                HashMap<String, Person> map = new HashMap<String, Person>();
                map.put("a",new Person("a",11));
                map.put("b",new Person("b",12));
                map.put("c",new Person("c",13));

                for(String key : map.keySet()){
                    Person p = map.get(key);
                    sout(key+"...."+p);
                }
            }
        }

        public class Person{
            private int age;
            private String name;

            public Person(){

            }
            public Person(String name, int age){
                this.name = name;
                this.age = age;
            }
            getter
            setter
            @Override
            public String toString(){
                return "Person"+"..."+name+"..."+age;
            }

            //當Person作為map的鍵時,為了保證鍵的唯一性,必須重寫hashCode()和equals()方法。
        }

    LinkedHashMap
        /*
        LinkedHashMap繼承HashMap
        保證迭代的順序
        */
        public class LinkedHashMapDemo{
            psvm{
                LinkedHashMap<String, String> link = LinkedHashMap<String, String>();
                link.put("a","1");
                link.put("b","2");
                link.put("c","3");
                link.put("d","4");

                sout(link);    //怎麼存進去,就會怎麼取出來
            }
        }

    HashTable
        /*
        Map介面實現類 HashTable
        底層資料結構雜湊表,特點和hashMap時一樣的
        HashTable執行緒安全,執行速度慢
        HashMap執行緒不安全,執行速度快

        HashTable命運和Vector一樣

        HashMap 允許儲存null值,null鍵
        HashTable 不允許儲存null值,null鍵

        HashTable的子類,Properties,依然活躍在開發舞臺
        */