Map详解

简介: Map详解

今日金句

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



一、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集合
目录
相关文章
使用JavaStream将List转为Map
使用JavaStream将List转为Map
|
6月前
|
存储 JavaScript 前端开发
Object和Map的区别
Object和Map的区别
|
7月前
|
Java
map.getOrDefault
map.getOrDefault
62 0
|
7月前
|
存储 缓存 Java
map应用
map应用
81 0
|
7月前
|
存储 算法 安全
Map中的那些事
Map中的那些事
74 0
|
7月前
|
算法 C++ Python
map的使用(C++)
map的使用(C++)
85 0
|
JSON 数据库 数据格式
Map和List的碰撞
Map和List的碰撞
58 0
|
安全
Map
Map
89 0
|
机器学习/深度学习 计算机视觉
简单理解mAP究竟是什么
简单理解mAP究竟是什么
简单理解mAP究竟是什么