ArrayList,HashSet,HashMapを巡る.(全面)

6003 ワード

前言:ネット上のループを見て、多くのブログの内容が少ないので、リストだけを言ったり、setやmapだけを言ったりして、整理したいので、いくつかを整理します.まとめもしましたが、皆さんにも役に立つことを願っています.以下のdemoの完全なコードはgithub上でダウンロードできます(リンクアドレス)

(一)リストを遍歴する

        List list = getArrayList();
        /**
         *  , for 
         */
        for (int i = 0, len = list.size(); i < len; i++) {
            String s = list.get(i);
            System.out.println(s);
        }

        /**
         *  , for 
         */
        for (String s : list) {
            System.out.println(s);
        }

        /**
         *  , for Iterator
         */

        for(Iterator iterator = list.iterator(); iterator.hasNext();){
            String value = iterator.next();

            System.out.println(value);
        }

        /**
         *  , while Iterator( 3 )
         */
        Iterator iterator = list.iterator();
        while (iterator.hasNext()){
            String s = iterator.next();
            System.out.println(s);
        }

    /**
     *  List, 
     * @return  List
     */
    public static List getArrayList() {
        List list = new ArrayList<>();

        list.add("aa");
        list.add("bb");
        list.add("cc");
        list.add("dd");

        return list;
    }

PS:以上がList遍歴の4つの方式です.
  • 人はandroidにとってデータ量は大きくなく、効率も悪くなく、自分の都合のいいものを使っていると考えています.
  • 理論上、方式1は最も速いが、同時問題を考慮する必要がある.削除操作を行うにはiteratorしか使用できません.
  • foreachとfor:foreachは最初から最後まで、後ろから遍歴してはいけません.foreachループでは反復変数に値を割り当てることはできません(反復変数の内容を与えることができます).たとえば、Userリファレンスを変更することはできません.このリファレンスでUser内部データを変更することができます.

  • (二)HashSetを巡る

        public static void main(String[] args) {
    
            Set set = getHashSet();
            /**
             *  1, for 
             */
            for (String value : set) {
                System.out.println(value);
            }
            /**
             *  2, Iterator
             */
            Iterator iterator = set.iterator();
            while (iterator.hasNext()) {
                String value = iterator.next();
                System.out.println(value);
            }
    
            /**
             *  3, for Iterator, 2 , 
             */
            for (Iterator iterator2 = set.iterator(); iterator2.hasNext(); ) {
                String value = iterator.next();
                System.out.println(value);
            }
    
    
        }
    
        /**
         *  Set, 
         *
         * @return  Set
         */
        public static Set getHashSet() {
            Set set = new HashSet<>();
            set.add("aa");
            set.add("bb");
            set.add("cc");
            return set;
        }
     
    

    PS:setはnull要素を追加することができ、重複する要素を追加することはできない(重複要素はhashCodeとequalsを判断の根拠とする)、add(Object)の場合、setがObjectのhashCodeと同じ要素が存在しなければ直接add.存在する場合はequalsメソッドを呼び出して2つの要素を比較し、trueを返すと同じ要素として、そうでない場合は異なる要素として、要素をセットに追加します.重複要素検証を具体的に追加するには、ケースのCollectionsDemoを参照し、Studioクラスを変更すると検証できます.

    (三)Mapを遍歴する

        public static void main(String[] args) {
            Map map = getHashMap();
    
            /**
             *  1, for-each。
             */
            for (Map.Entry entry : map.entrySet()) {
                System.out.println("key:" + entry.getKey() + ",value:" + entry.getValue());
            }
    
            /**
             * 2, Iterator ( )
             */
            Iterator> iterator = map.entrySet().iterator();
            while (iterator.hasNext()) {
                Map.Entry entry = iterator.next();
                System.out.println("key:" + entry.getKey() + ",value:" + entry.getValue());
            }
    
            /**
             * 3, Iterator ( )
             */
            Iterator iterator1 = map.entrySet().iterator();
            while (iterator1.hasNext()) {
                Map.Entry entry = (Map.Entry) iterator1.next();
                System.out.println("key:" + entry.getKey() + ",value:" + entry.getValue());
            }
    
            /**
             *  4, ( )
             */
            for (String key : map.keySet()) {
                String value = map.get(key);
                System.out.println("key:" + key + ",value:" + value);
            }
    
            /**
             *  5, key value 
             */
            for (String key : map.keySet()) {
                System.out.println("key:" + key);
            }
    
            for (String value : map.values()) {
                System.out.println("value:" + value);
            }
    
        }
    
        /**
         *  Map, 
         *
         * @return Map
         */
        public static Map getHashMap() {
            Map map = new HashMap<>();
            map.put("a", "a_value");
            map.put("b", "b_value");
            map.put("c", "c_value");
            return map;
        }
    

    PS:mapは一般的にIterator遍歴またはfor-each遍歴を用いる

    まとめ

  • 削除問題ループをループするときに削除を使用する場合は、コレクション参照を直接使用して削除操作を行うとConcurrentModificationException異常が放出され、Iteratorのremoveメソッドを呼び出す必要があります.例:{@link ListTraverseDemo#testTraverseRemove()}
  • 添加元素問題setは重複する元素を添加することができず(重複元素はhashCodeとequalsを判断根拠とする)、add(Object)の場合、setがObjectのhashCodeと同じ元素が存在しなければ直接add.mapが同じkeyを追加して存在する場合、そのvalueは前のvalueを上書きします.
  • null要素listとsetを追加できますか?mapのkeyとvalueはすべてできます.
  • PS:set内部はmapを用いて実現され,格納要素の使用,setのvalueはmapのkey,setはmapのvalueとして参照される.
  • 線城安全問題ArrayList,HashMap,HashSetはいずれも安全ではない.Collectionsのメソッドを使用して、synchronizedMap(map)、synchronizedList(list)、synchronizedSet(set)のセキュリティタイプのセットに変換できます.

  • PS:内部は実は装飾モードを使用しています:この集合クラスを継承し、強化方法、書き換え操作の方法でsynchronizedを使用して被装飾オブジェクトを呼び出す操作方法.
    私はただ主な注意点をざっとまとめただけで、能力は限られていて、もし不当なところがあれば、皆さんの指摘を歓迎して、もし無視しやすくて間違いを犯しやすい注意点があれば、補充して提出することを歓迎します.