集合框架---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<Character,int>   <字符,该字符个数>  
     */
    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无序,结构不同,他们的访问算法也不一样.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HashMap的几遍历方式如下: 1. Entry遍历:使用entrySet()方法可以同时遍历Map里面的Key和Value。可以通过迭代器或者foreach循环来实现。例如: ```java HashMap<String, Integer> map = new HashMap<>(); // 添加键值对 map.put("A", 1); map.put("B", 2); map.put("C", 3); // 使用entrySet()方法遍历 for (Map.Entry<String, Integer> entry : map.entrySet()) { String key = entry.getKey(); Integer value = entry.getValue(); // 处理key和value } ``` 2. keySet遍历:使用keySet()方法可以遍历Map里面的Key。可以通过迭代器或者foreach循环来实现。例如: ```java HashMap<String, Integer> map = new HashMap<>(); // 添加键值对 map.put("A", 1); map.put("B", 2); map.put("C", 3); // 使用keySet()方法遍历 for (String key : map.keySet()) { Integer value = map.get(key); // 处理key和value } ``` 3. foreach遍历:在JDK8及以上版本,可以直接使用foreach循环来遍历HashMap的键值对。例如: ```java HashMap<String, Integer> map = new HashMap<>(); // 添加键值对 map.put("A", 1); map.put("B", 2); map.put("C", 3); // 使用foreach遍历 map.forEach((key, value) -> { // 处理key和value }); ``` 4. keySet foreach遍历:在JDK8及以上版本,可以使用keySet()方法获取键的集合,然后使用foreach循环遍历。例如: ```java HashMap<String, Integer> map = new HashMap<>(); // 添加键值对 map.put("A", 1); map.put("B", 2); map.put("C", 3); // 使用keySet foreach遍历 for (String key : map.keySet()) { Integer value = map.get(key); // 处理key和value } ``` 以上是HashMap的几常见遍历方式。根据具体的需求,可以选择适合的遍历方式来操作HashMap的键值对。 #### 引用[.reference_title] - *1* *3* [Java - 关于HashMap通过keySet遍历kv的二次调用问题](https://blog.csdn.net/Zong_0915/article/details/120905738)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [HashMap的七遍历方式](https://blog.csdn.net/maojian_ohhey/article/details/115431835)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值