前言
今天这篇就是小编给大家带来的集合框架的最后一篇啦,坚持就是胜利!加油💪!
目录
1、Map集合的特点
1.1、以键值对的形式存在
//定义一个map集合
HashMap hs= new HashMap<>();
//map集合是以键值对的方式存在的
//map集合的增删改查
//增加
hs.put("one", 1);
hs.put("two", 2);
1.2、map集合中的key值和value值都是可以为空的
hs.put(null,null);
在Java中,Map集合中的key和value都可以为null,但需要注意一些细节:
-
key可以为null
在HashMap、LinkedHashMap、ConcurrentHashMap等Map实现中,key可以为null。在使用get()、containsKey()等方法获取Map中的元素时,如果key为null,会返回对应的value,否则会返回null。 -
value可以为null
在所有的Map实现中,value可以为null。在使用containsValue()、remove()等方法时,如果value为null,会返回对应的key,否则会返回null。但需要注意的是,在使用get()方法获取Map中的元素时,如果value为null,也会返回null。因此在存储null值时需要注意与实际值的区别。 -
TreeMap的key不能为null
由于TreeMap是基于红黑树实现的Map,需要根据key来进行排序,因此不能存储null值。如果尝试在TreeMap中存储null值,则会抛出NullPointerException。 -
Hashtable的key和value都不能为null
Hashtable是Java中线程安全的Map实现之一,它的key和value都不能为null。在尝试存储null值时,会抛出NullPointerException。
总之,虽然Map中的key和value都可以为null,但为了避免空指针异常等问题,在使用时需要根据具体情况进行判断和处理。
2、map集合的遍历方式
2.1、Entryset()
Set entrySet = hs.entrySet();
//遍历set集合中的对象
for (Object object : entrySet) {
Map.Entry set=(Map.Entry)object;
//打印
System.out.println("名字:"+set.getKey()+" 值:"+set.getValue());
}
2.2、keyset()、get()
//按照我的猜想,底层的逻辑应该是获取到了其中的key,然后再将其放到set集合中,方便我们进行遍历
//通过map集合中的get方法可以直接通过key获取其中的value值
//通过map集合中的keyset方法可以获取到map集合中所有的key放到set集合之中
Set keySet = hs.keySet();
for (Object object : keySet) {
System.out.println("key为:"+object+" 值为:"+hs.get(keySet));
}
3、练习题
好啦小伙伴们,了解了map集合基本的增删改查,我们接下来就来做一下练习题吧💕
问:
String str= "123213456666";
//这里有一个字符串,现在需要使用map集合记录其中每一个数字出现的次数并且按照次数控制台输出
答:
// 定义一个字符串
String str= "123213456666";
HashMap<Character,Integer> map= new HashMap<Character,Integer>();
// 首先将字符串通过toCharArray进行一个分割
char[] cs = str.toCharArray();
// 然后遍历这些字符串
for (char c : cs) {
// 然后通过map集合中的get方法进行判断,看这个字符串在我们的map集合中是否存在,如果不存在会返回一个null,如果存在那么就将当前的这个键进行一个修改
Integer i = map.get(c);
if(i==null) {
//如果不存在,那么就将这个字符串加进去,设置它的次数为1
map.put(c, 1);
}else if(i!=null) {
//如果已经存在这个值了,那么就将这个次数加1
map.put(c, i+1);
}
}
此时,我们已经把所有的字符出现的次数计算好了,接下来只需要将其中的次数进行排序就可以了
那么我们应该怎么进行排序呢?可以联想一下,在上一篇中,我们可以使用treeset对set集合进行排序,那么我们是不是也可以使用treemap对map集合进行排序呢?答案是肯定的
TreeMap<Character, Integer> tp= new TreeMap<Character, Integer>(new Comparator<Character>() {
@Override
public int compare(Character o1, Character o2) {
//因为我们的需求是根据值也就是次数进行排序
//所以我们这里通过map集合中的键获取值进行对比
//因为此时我们的排序器需要有一个进行排序的对象,如果比较器比较的对象为空,那么就会报出一个空指针异常,所以只能根据map集合中的内容来进行排序,并且要保证map集合不为空
if(map.get(o2)-map.get(o1)==0) {
return o2-o1;
}
return map.get(o2)-map.get(o1);
}
});
到这里,我们就已经定义好了treemap集合的排序规则,现在我们只需要将map集合添加到treemap集合中进行遍历看结果就行了
//直接把map集合添加进去
tp.putAll(map);
//遍历treemap
Set<Character> keySet = tp.keySet();
for (Character character : keySet) {
System.out.println(character+"出现了"+tp.get(character)+"次");
}
看看打印的结果如何