Map集合

262 阅读4分钟

今日金句

于高山之巅方见大河奔涌 于群峰之上更觉长风浩荡

一、Map集合

1.1 概念

Map是一种用于存储键值对的Java集合,它可以在不担心索引的情况下根据键快速查找值。Map中的每个元素都是一个键值对,其中键是唯一的,而值可以重复。 Map集合和Collection集合没有任何关系。

1.2体系

Map集合的实现类主要为HashMap、HashTable。子接口有一个SortedMap,SortedMap有一个TreeMap实现类。 在这里插入图片描述

1.3特点

1.3.1键的唯一性:

Map中的键是唯一的,如果重复添加相同键的值,则后续的元素会覆盖之前的元素,即键不允许重复,但值可以重复,==键也可以为空==。

1.3.2对象引用:

Map中的键和值都可以是任何Java对象,这使得我们可以将Map用于各种应用场景。

1.3.1无序:

不同的Map实现能够按不同的方式(例如哈希、树等)来组织“键-值”对,因此在不同的Map实现中,元素的顺序可能会不同。

1.3.1快速查找:

Map提供了快速查找元素的方法,我们可以根据键来查找值,这样可以避免使用循环进行线性查找,提高了查找效率。

二、遍历方式

因为没有继承Collection集合,以及数据结构不同,所有map集合的遍历方法与List和Set遍历方式不同

2.1 keySet()

		Map<String, Integer> map = new HashMap<String, Integer>();
		map.put("a", 1);
		map.put("b", 2);
		map.put("c", 3);
		Set keySet = map.keySet();// 得到所有键
		for (Object key : keySet) {// 遍历所有键
			// 打印键,根据键拿到值
			System.out.println("key:" + key + ";value:" + map.get(key));
			// key:a;value:1
			// key:b;value:2
			// key:c;value:3
		}

2.2 entrySet()

		Map<String, Integer> map = new HashMap<String, Integer>();
		map.put("a", 1);
		map.put("b", 2);
		map.put("c", 3);
		for (Map.Entry<String, Integer> entry : map.entrySet()) {
			// 获取当前遍历的键
			String key = entry.getKey();
			// 获取当前遍历的值
			Integer value = entry.getValue();
			// 打印当前遍历的键值对
			System.out.println("key:" + key + ";value:" + value);
			// key:a;value:1
			// key:b;value:2
			// key:c;value:3
		}

三、HashMap

3.1 概述

3.1 概念

HashMap是Java中实现Map接口的一种散列表(Hash table)实现类。

3.2 数据结构

HashMap,与我们上一篇博客中介绍的HashSet从形式上看简直就像孪生兄弟,那么数据结构呢?没错也是!它们的数据结构都是哈希表(散列表)。

HashMap是使用数组(Array)和链表(LinkedList)结构实现的散列表(Hash table),称为链式哈希表(Chain Hash Table)。

具体来说,HashMap内部维护了一个桶(Bucket)数组,每个桶又是一个链表结构。当有新元素需要加入HashMap时,首先计算出它的哈希值,然后用哈希值对桶数组的长度进行取余操作,确定它将被存储在哪个桶中。如果该桶还没有存储任何元素,则直接将该元素存储在该桶中;否则遍历该桶中的链表,查找是否已经存在相同key的元素,如果存在则更新对应的value,否则将新元素添加到链表的尾部。

3.3 特点

  • 无序的。其遍历顺序不是放入顺序,也不是按照键的排序顺序。

  • HashMap允许null键和null值

  • HashMap不是线程安全的,需要使用synchronized关键字进行同步处理。

  • HashMap的默认初始化容量为16,负载因子为0.75,即当实际元素个数超过容量的75%时,就会触发扩容操作,因为底层数据结构有数组嘛

3.4 常见面试题:统计字符串的字符出现的次数

问:给定一段字符 "bcujbuwhdbjhaxjbmzjxnuwgrgq",统计字符串的字符出现的次数

大家可以先思考一下,小小提示一下,根据map集合的特点实现

有没有想出来呢?其实就是根据键的唯一性来完成的,键是唯一的,而值会被覆盖

package com.xqx.map;

import java.util.HashMap;
import java.util.Map;

/**
 * 
 * 考察核心:
 * 键值对的特点:键不可以重复,但是键对应的值可以覆盖 
 * 
 * @author W许潜行
 *
 */
public class Demo2 {

	public static void main(String[] args) {
		
		String str="bcujbuwhdbjhaxjbmzjxnuwgrgq";
		//将字符串转成字符
		char[] charArray = str.toCharArray();
		//创建集合
		Map<Character,Integer> map=new HashMap<>();
		//遍历字符
		for (char c : charArray) {
			//将字符作为map的key,去找该key对应的值是否存在
			Integer charVal = map.get(c);
			if (charVal!=null) {
				map.put(c, charVal+1);
			}else {
				map.put(c, 1);
			}
			
		}
		for (Map.Entry<Character,Integer> entry : map.entrySet()) {
			// 获取当前遍历的键
			Character key = entry.getKey();
			// 获取当前遍历的值
			Integer value = entry.getValue();
			System.out.println(key+"出现了"+value+"次");
		}
		
	}
}

我们总结一下实现的步骤:

  • 1.要将统计字符串中的所有字符获取到
  • 2.将字符进行遍历
  • 3.以字符做为map集合的key,在map集合中去找该key对应的值是否存在
  • ①如果存在,key对应的值+1进行key的覆盖
  • ②反之: key对应的值默认为1
  • 4.遍历map集合