2020-08-28 HashMap的遍历

HashMap:

  根据hashCode方法生成的hash值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。HashMap最多只允许一条记录的键为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<k>(包含键的set集合)】
         *              ② 使用迭代器遍历集合,
         *              ③ 使用迭代器的iter.hasNext()方法判断下一个元素是否为空,使用iter.next()方法取出键;
         *              ④ 根据键就可以得到value;
         *
         *           方法二:
         *              ① 将(key--value)键值对存放到节点
         *              ② 将节点<Entry></>保存到set集合中
         *              ③ 将节点存放到迭代器<Interator>中
         *              ④ 既然在迭代器中,就可以使用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());
        }

    }
}

两个方法的异同;
不同之处在于第一个方法只是将的值存到set集合中,而第二种方法是将键值对存到集合中
再总结一下:
  方法一:
  将键值对(key–value)中的键(key)保存到Collection所属的集合中,这样就可以用Iterator(迭代器)使用hasNext()方法和next()方法,通过键获取值。
  方法二:
  让键值对成为一个节点(Entry),将节点(Entey)保存到Collection所属的集合中,这样就可以用Iterator(迭代器)使用hasNext()方法和next()方法,通过键获取值。

  一句话,没有条件使用迭代器,创造条件也要使用迭代器。

  • 0
    点赞
  • 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、付费专栏及课程。

余额充值