Map学习心得

Map的学习心得

Map简介

Map的主要特点就是包含键值对,即Map<key,value>。在这里我们可以形象的把Map看作是一个游戏账号。对于游戏账号来说,key也就是账号是所有人都可见的,而value也就是密码才是每一个真正看重的。所以Map里面,key是可见的,而value是默认隐藏的。

设置值(Map.put<key,value>)

Map设置值的方法是Map.put<key,value>,这里有一点特别,就是Map里面如果有多个键值对,他们的排列顺序是无序的,不是按照时间的先后顺序来排列,这点也可以看出Map比起数组更特殊的是他的键值对方式,所以后续对Map进行操作的时候也大多都是通过key来对Map进行操作。

// Map增加值,Map.put<key,value>
//Map集合里面的数据是随机排列的,不是按照时间的先后顺序排列
Map<String,Integer> hasmap=new HashMap<String, Integer>();
        hasmap.put("第一个",1);
        System.out.println(hasmap);
        hasmap.put("第二个",2);
        System.out.println(hasmap);
        hasmap.put("第三个",3);
        System.out.println(hasmap);

可以可以看出Map里面是无序排列

Map的修改,Map.put<key,value>,Map.replace(key,value)

正如上文所言,Map可以看做游戏账号,一个账号同一时间段只能对应一个秘密,所以通过put设置值,最新的会覆盖之前的值。这里也有一点要注意,在修改值的时候获取value,获取的是修改之前的value,如果获取初始化时候的value值,则为null

hasmap.put("账号",1);
        System.out.println(hasmap);
        hasmap.put("账号",2);
        System.out.println(hasmap);
        hasmap.put("账号",3);
        System.out.println(hasmap);
        //取代之前,通过key获取的value值是修改之前的value值,获取这个value之前没有值,则返回null
        int i=hasmap.put("账号",4);
        System.out.println("修改时候的value值为:"+i);
        System.out.println("修改之后的Map的value值:"+hasmap.get("账号"));//Map.get(key)可以获取当前key对应的value值。

在这里插入图片描述
这里刚开始可能有小伙伴会把int i=hasmap.put(“账号”,4)这时候的i值认为是4,但这个时候其实他的值为三,为修改之前的值,所以我们以此类推,如果我们创建一个Map,我们再去获取他的值的话,他应该是null,因为创建之前它是空的。

在这里插入图片描述
这里可以看出,因为初始化之前的haspmap是null,而这个时候这个i对应的是初始化之前的value值,导致一个把null赋给了一个int,故这里报了空指针的错误。
在这里插入图片描述
直接输出初始化之前的value值为null,也可以证明我们的理论是正确的。

删除,map.remove(key)

// Map的删除,Map的删除主要是通过key来删除,即Map.remove(key);
		hasmap.put("第一个",1);
        hasmap.put("第二个",2);
        hasmap.put("第三个",3);
        System.out.println(hasmap);
        hasmap.remove("第一个");
        System.out.println(hasmap);

在这里插入图片描述
key为第一个的键值对被删除。

Map还有一种删除方法是clear,他是直接把map变为null。清除当前Map的所有值
在这里插入图片描述
我看了下clear的源代码,里面的root=null,也可以证实map在初始化之前为null的理论。
在这里插入图片描述

Map其他常用的方法

hasmap.put("第一个",1);
        hasmap.put("第二个",2);
        hasmap.put("第三个",3);
        System.out.println(hasmap.size());
        //查看Map的大小
        System.out.println("是否包含key值为”第一个的“的键值对:"+hasmap.containsKey("第一个"));
        //是否包含某个key值
        System.out.println("是否包含value值为3的键值对:"+hasmap.containsValue("3"));
        //是否包含某个value值
        System.out.println("键值对是否为空:"+hasmap.isEmpty());
        //是否为空

##map.put()和map.replace的区别
我先把replace的源码贴出来给大家看下
在这里插入图片描述
重点在这个if 判断句,他的意思是说如果根据key值获得的value值不为0或者包含这个key值,我们就可以对它进行put修改,replace 本质上还是通过put的方法进行修改,但是他做了一个限制。大家可以想一想,如果我们通过replace来修改一个未创建的值会发生什么情况?对,它进不了这个if判断句,所以他不能进行修改。而put则没有这个限制,你没有我直接给你创建一个,一条龙上门服务。但是replace的好处就在于可以有效防止错误,说不定哪天走个神,打错一个字母,本来想修改的直接就一条龙服务创建了,然后也没报错,就是得不到自己想要的结果,那感觉,懂得都懂。

在这里插入图片描述

 hasmap.put("第三个",3);
        System.out.println("初始化之后的map:"+hasmap);
        hasmap.replace("第四个",4);
        System.out.println("通过replace来修改一个未创建的MAP:"+hasmap);
        hasmap.put("第四个",4);
        System.out.println("通过put来修改一个未创建的MAP::"+hasmap);
        hasmap.replace("第三个",5);
        System.out.println("通过replace来修改一个已创建的MAP:"+hasmap);
        hasmap.put("第三个",6);
        System.out.println("通过put来修改一个已创建的MAP::"+hasmap);

三种迭代方法

package day921;

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

public class Map02 {
    public static void main(String[] args) {
        Map<String,Integer> hasmap=new HashMap<String, Integer>();
        hasmap.put("第一个",1);
        hasmap.put("第二个",2);
        hasmap.put("第三个",3);
        System.out.println(hasmap);
        //第一种迭代方式,通过得到所有的key来迭代Map,但只能获得key,value只能通过key来获得
        Set<String> hasset=hasmap.keySet();
        for (String key:hasset) {
            int value=hasmap.get(key);
            System.out.println(key+":"+value);
        }
        System.out.println("---------");
        //只能得到所有的value值,不能得到key值,因为无法通过value值反推key值
        Collection<Integer> collectionValue=hasmap.values();
        for(int i:collectionValue){
            System.out.println(i);
        }
        System.out.println("方法三");
        //可以同时得到key和value值,用entrySet方法
        Set<Map.Entry<String,Integer>> allSet=hasmap.entrySet();
        for (Map.Entry<String,Integer> entry:allSet){
            System.out.println(entry.getKey()+":"+entry.getValue());
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值