集合框架---HashMap的3种遍历、统计字符串中每字符个数

创建测试类:

import java.util.*;

public class MyCount {
    public static void main(String[] args) {
        Map<Character, Integer> testMap = letsCount("111jjuu99");

        //遍历方式1: 拿到 键值对
        Set<Map.Entry<Character, Integer>> entries = testMap.entrySet();
        Iterator<Map.Entry<Character, Integer>> iterator = entries.iterator();
        while (iterator.hasNext()){
            Map.Entry<Character, Integer> entry = iterator.next();
            System.out.println("字符:"+entry.getKey()+"的个数为:"+entry.getValue());
        }
        


        //遍历方式2: 仅拿到 所有Key
        Set<Character> keys = testMap.keySet();
        for (Character key : keys) {
            System.out.println("字符:"+key+"的个数为:"+testMap.get(key));
        }




        //遍历方式3: 仅拿到 所有Value  =个数
        Collection<Integer> values = testMap.values();
        for (Integer value : values) {
            System.out.println("个数是:"+value);
        }

    }


    /**
     * 统计该字符串中的每1个字符 个数
     * @param str
     * @return hashmap   <字符,该字符个数>  
     */
    public static Map<Character,Integer> letsCount(String str){
        Map<Character, Integer> hm = new HashMap<>();

        char[] chars = str.toCharArray();
        for (char aChar : chars) {
            if(hm.containsKey(aChar)){
                hm.put(aChar,hm.get(aChar)+1);
            }else{
                hm.put(aChar,1);
            }
        }
        return hm;
    }
}

关于 迭代器Iterator 和 增强for循环 的选择:

简化版:
推荐用迭代器Iterator。
a,可在迭代 同时用 Iterator的删除、增加方法——ListIterator
b.当list改为set数据结构,不用改遍历代码一直是Iterator

详细版:
可以看出,使用for each循环语句的优势在于更加简洁,更不容易出错,
不必关心 下标的起始值和终止值。
forEach不是关键字,关键字还是for,语句是由iterator实现的,

他们最大的不同之处就在于remove()方法上。

一般调用删除和添加方法都是具体集合的方法,例如:

List list = new ArrayList(); list.add(…); list.remove(…);

但是,如果在循环的过程中调用集合的remove()方法,就会导致循环出错,
因为循环过程中list.size()的大小变化了,就导致了错误。
所以,如果想在循环语句中删除集合中的某个元素,就要用迭代器iterator的remove()方法,
因为它的remove()方法不仅会删除元素,还会维护一个标志,用来记录目前是不是可删除状态,
例如,你不能连续两次调用它的remove()方法,调用之前至少有一次next()方法的调用。

forEach就是为了让用iterator循环访问的形式简单,写起来更方便。
当然功能不太全,
所以但如有删除操作,还是要用它原来的形式。

对比:

效率上

采用ArrayList对随机访问比较快,而for循环中的get()方法,采用的即是随机访问的方法,因此在ArrayList里,for循环较快

采用LinkedList则是顺序访问比较快,iterator中的next()方法,采用的即是顺序访问的方法,因此在LinkedList里,使用iterator较快

从数据结构角度分析,for循环适合访问顺序结构,可以根据下标快速获取指定元素.而Iterator 适合访问链式结构,因为迭代器是通过next()和Pre()来定位的.可以访问没有顺序的集合.

而使用 Iterator 的好处在于可以使用相同方式去遍历集合中元素,而不用考虑集合类的内部实现(只要它实现了 java.lang.Iterable 接口),如果使用 Iterator 来遍历集合中元素,一旦不再使用 List 转而使用 Set 来组织数据,那遍历元素的代码不用做任何修改,如果使用 for 来遍历,那所有遍历此集合的算法都得做相应调整,因为List有序,Set无序,结构不同,他们的访问算法也不一样.

你可能感兴趣的:(集合框架---HashMap的3种遍历、统计字符串中每字符个数)