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