2020-08-28 HashMapの遍歴

17158 ワード

HashMap:
  hashCodeメソッドに従って生成されたhash値はデータを格納し、多くの場合、その値に直接位置決めできるため、アクセス速度は速いが、遍歴順序は不確定である.HashMapでは、最大1つのレコードのみを許可するキーがnullであり、複数のレコードの値がnullであることを許可します.HashMapは非スレッドで安全です.つまり、任意の時点で複数のスレッドが同時にHashMapを書くことができ、データの不一致を招く可能性があります.スレッドセキュリティを満たす必要がある場合は、CollectionsのsynchronizedMapメソッドを使用してHashMapにスレッドセキュリティ機能を持たせるか、ConcurrentHashMapを使用します.
1.HashMap遍歴方法:
①keySet  
②entrySet  
③   keySet  
④   entrySet  

1.HashMapの特徴:
①JDK1.2  ,     ,     。
②   null   key  value。
③    :   。
④HashMap   Map  ,Map     (  )     。⑤Map        。
⑥Map          ,HashMap TreeMap。
⑦TreeMap          , HashMap   。

3.どうやって?
次のコードとコメントを参照してください.
package hashMap;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class Demo01 {
     
    public static void main(String[] args) {
     
        HashMap<Integer, String> map = new HashMap<>();
        // 
        map.put(1, "  ");
        map.put(2, "  ");
        map.put(3, "  ");
        map.put(4, "  ");
        map.put(5, "  ");
        map.put(6, "  ");
        System.out.println(map);
        //  
        map.remove(2);
        System.out.println("      "+map);
        //          ,   
        map.remove(6);
        map.put(6, "  ");
        System.out.println("      "+map);
        //  
        System.out.println("      :"+map.get(3));
        System.out.println("keySet  ");
        for (Integer key:map.keySet()
             ) {
     
            System.out.println(key+" "+map.get(key));
        }
        System.out.println("entrySet  ");
        for (Map.Entry<Integer,String> entry:map.entrySet()
             ) {
     
            System.out.println(entry.getKey()+" "+entry.getValue());
        }

        /**
         *      1.       fori     ,      ,   i     
         *
         *      2.    (Iterator)   ,          Collection  
         *
         *      3.          ,                  
         *
         *          :
         *             :
         *              ①   keySet()    map    key   set   ,keySet()      【set(    set  )】
         *              ②          ,
         *              ③       iter.hasNext()             ,  iter.next()     ;
         *              ④         value;
         *
         *              :
         *              ①  (key--value)        
         *              ②    >   set   
         *              ③           
         *              ④        ,     hasNext()       next()       (key--value)         
         *              ⑤         (key--value)     key value      
         */
        Set<Integer> set=map.keySet();
        Iterator<Integer> iter=set.iterator();
        while(iter.hasNext()){
     //    hasNext  :  next                 ,   true
            Integer key= iter.next();
            System.out.println("key:"+key+",value:"+map.get(key));
        }
        /**
         *         while       Iterator iter.next()         ,    
         *          ①          ,        
         *          ②         (NoSuchElementException),
         *        :
         *           ① iter.next()             ,           ,
         *               while      iter.next()   ,           ,          
         *           ② iter.hasNext()             ,          
                */
        System.out.println();
        Set<Map.Entry<Integer,String>> set1=map.entrySet();
        Iterator<Map.Entry<Integer,String>> it= set1.iterator();
        while(it.hasNext()){
     
            Map.Entry<Integer,String> entey=it.next();
            System.out.println("key:"+entey.getKey()+"value:"+entey.getValue());
        }

    }
}


2つの方法の異同.異なる点は、第1の方法は、キーの値をsetセットに格納するだけであり、第2の方法は、キー値ペアをセットに格納することである.  メソッド2:  キー値ペアを1つのノード(Entry)にし、ノード(Entey)をCollectionが属する集合に保存することで、hasNext()メソッドとnext()メソッドをIterator(反復器)で使用してキーで値を取得できます.
  一言で言えば、反復器を使用する条件はなく、条件を作成するにも反復器を使用します.