集合框架之map集合

前言

今天这篇就是小编给大家带来的集合框架的最后一篇啦,坚持就是胜利!加油💪!


目录

前言

1、Map集合的特点

1.1、以键值对的形式存在

1.2、map集合中的key值和value值都是可以为空的

2、map集合的遍历方式

2.1、Entryset()

2.2、keyset()、get()

3、练习题

问:

答:


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,但需要注意一些细节:

  1. key可以为null
    在HashMap、LinkedHashMap、ConcurrentHashMap等Map实现中,key可以为null。在使用get()、containsKey()等方法获取Map中的元素时,如果key为null,会返回对应的value,否则会返回null。

  2. value可以为null
    在所有的Map实现中,value可以为null。在使用containsValue()、remove()等方法时,如果value为null,会返回对应的key,否则会返回null。但需要注意的是,在使用get()方法获取Map中的元素时,如果value为null,也会返回null。因此在存储null值时需要注意与实际值的区别。

  3. TreeMap的key不能为null
    由于TreeMap是基于红黑树实现的Map,需要根据key来进行排序,因此不能存储null值。如果尝试在TreeMap中存储null值,则会抛出NullPointerException。

  4. 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)+"次");
		}
		

看看打印的结果如何

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: Java集合框架中的Map是一种键对的数据结构,可以存储一组具有唯一键和对应的元素。使用泛型可以在编译时进行类型检查,确保集合中只能存储指定类型的元素,提高代码的可读性和安全性。 在引用中的示例代码中,List<String>定义了一个只能存储字符串类型元素的列表。在引用中的示例代码中,Collection<String>和Collection<Integer>分别定义了只能存储字符串类型和整数类型元素的集合。使用泛型通配符可以增加集合的灵活性。比如在coll.removeAll(c)方法中,传入的Collection对象的泛型可以是任意类型。另外,泛型还可以应用于Map集合,如引用中的示例代码中,Set<Map.Entry<String,String>>定义了只能存储键对类型为String的元素的集合。 综上所述,Java集合框架中的Map和泛型可以一起使用,通过泛型可以指定集合中存储的元素类型,增加代码的可读性和类型安全性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [java基础中的--------Map+泛型](https://blog.csdn.net/liutaiwu/article/details/107915445)[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.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值