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());
}
}
}