今日金句
于高山之巅方见大河奔涌 于群峰之上更觉长风浩荡
一、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集合