|NO.Z.00061|——————————|BigDataEnd|——|Java&集合类库.V09|——|Java.v08|Map集合|
一、Map集合
### --- Map集合
~~~ [Map集合的概念]——[元素放入HashMap集合的过程]——[Map集合实现元素的查找和删除操作]
~~~ [Map集合的三种遍历方式]
### --- 基本概念
——> java.util.Map<K,V>集合中存取元素的基本单位是:单对元素,其中类型参数如下:
——> K - 此映射所维护的键(Key)的类型,相当于目录。
——> V - 映射值(Value)的类型,相当于内容。
——> 该集合中key是不允许重复的,而且一个key只能对应一个value。
~~~ # 该集合的主要实现类有:
——> HashMap类、TreeMap类、LinkedHashMap类、Hashtable类、Properties类。
——> 其中HashMap类的底层是采用哈希表进行数据管理的。
——> 其中TreeMap类的底层是采用红黑树进行数据管理的。
——> 其中LinkedHashMap类与HashMap类的不同之处在于内部维护了一个双向链表,
——> 链表中记录了元素的迭代顺序,也就是元素插入集合中的先后顺序,因此便于迭代。
——> 其中Hashtable类是古老的Map实现类,与HashMap类相比属于线程安全的类,
——> 且不允许null作为key或者value的数值。
——> 其中Properties类是Hashtable类的子类,该对象用于处理属性文件,
——> key和value都是String类型的。
——> Map集合是面向查询优化的数据结构, 在大数据量情况下有着优良的查询性能。
——> 经常用于根据key检索value的业务场景。
二、常用的方法
方法声明 | 功能介绍 |
V put(K key, V value) | 将Key-Value对存入Map,若集合中已经包含该Key, 则替换该Key所对应的Value, 返回值为该Key原来所对应的Value,若没有则返回null |
V get(Object key) | 返回与参数Key所对应的Value对象,如果不存在则返回null |
booleancontainsKey(Objectkey); | 判断集合中是否包含指定的Key |
booleancontainsValue(Object value); | 判断集合中是否包含指定的Value |
V remove(Object key) | 根据参数指定的key进行删除 |
Set keySet() | 返回此映射中包含的键的Set视图 |
Collection values() | 返回此映射中包含的值的Set视图 |
Set<Map.Entry<K,V>>entrySet() | 返回此映射中包含的映射的Set视图 |
三、元素放入HashMap集合的原理
### --- 元素放入HashMap集合的原理
——> 使用元素的key调用hashCode方法获取对应的哈希码值,
——> 再由某种哈希算法计算在数组中的索引位置。
——> 若该位置没有元素,则将该键值对直接放入即可。
——> 若该位置有元素,则使用key与已有元素依次比较哈希值,若哈希值不相同,
——> 则将该元素直接放入。
——> 若key与已有元素的哈希值相同,则使用key调用equals方法与已有元素依次比较。
——> 若相等则将对应的value修改,否则将键值对直接放入即可。
四、相关的常量
### --- 相关的常量
——> DEFAULT_INITIAL_CAPACITY : HashMap的默认容量是16。
——> DEFAULT_LOAD_FACTOR:HashMap的默认加载因子是0.75。
——> threshold:扩容的临界值,该数值为:容量*填充因子,也就是12。
——> TREEIFY_THRESHOLD:若Bucket中链表长度大于该默认值则转化为红黑树存储,
——> 该数值是8。
——> MIN_TREEIFY_CAPACITY:桶中的Node被树化时最小的hash表容量,该数值是64。
五、set集合转换为map的原理

六、编程代码
package com.yanqi.task15;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapTest {
public static void main(String[] args) {
// 1.准备一个Map集合并打印
Map<String, String> m1 = new HashMap<>();
// 自动调用toString方法,默认打印格式为:{key1=value1, key2=value2, ...}
System.out.println("m1 = " + m1); // {啥也没有}
// 2.向集合中添加元素并打印
String str1 = m1.put("1", "one");
System.out.println("原来的value数值为:" + str1); // null
System.out.println("m1 = " + m1); // {1=one}
str1 = m1.put("2", "two");
System.out.println("原来的value数值为:" + str1); // null
System.out.println("m1 = " + m1); // {1=one, 2=two}
str1 = m1.put("3", "three");
System.out.println("原来的value数值为:" + str1); // null
System.out.println("m1 = " + m1); // {1=one, 2=two, 3=three}
// 实现了修改的功能
str1 = m1.put("1", "eleven");
System.out.println("原来的value数值为:" + str1); // one
System.out.println("m1 = " + m1); // {1=eleven, 2=two, 3=three}
System.out.println("-------------------------------------------------------------");
// 3.实现集合中元素的查找操作
boolean b1 = m1.containsKey("11");
System.out.println("b1 = " + b1); // false
b1 = m1.containsKey("1");
System.out.println("b1 = " + b1); // true
b1 = m1.containsValue("one");
System.out.println("b1 = " + b1); // false
b1 = m1.containsValue("eleven");
System.out.println("b1 = " + b1); // true
String str2 = m1.get("5");
System.out.println("str2 = " + str2); // null
str2 = m1.get("3");
System.out.println("str2 = " + str2); // three
System.out.println("-------------------------------------------------------------");
// 4.实现集合中元素的删除操作
str2 = m1.remove("1");
System.out.println("被删除的value是:" + str2); // eleven
System.out.println("m1 = " + m1); // {2=two, 3=three}
System.out.println("-------------------------------------------------------------");
// 5.获取Map集合中所有的key并组成Set视图
Set<String> s1 = m1.keySet();
// 遍历所有的key
for (String ts : s1) {
System.out.println(ts + "=" + m1.get(ts));
}
System.out.println("-------------------------------------------------------------");
// 6.获取Map集合中所有的Value并组成Collection视图
Collection<String> co = m1.values();
for (String ts : co) {
System.out.println("ts = " + ts);
}
System.out.println("-------------------------------------------------------------");
// 7.获取Map集合中所有的键值对并组成Set视图
Set<Map.Entry<String, String>> entries = m1.entrySet();
for (Map.Entry<String, String> me : entries) {
System.out.println(me);
}
}
}
七、编译打印
D:\JAVA\jdk-11.0.2\bin\java.exe "-javaagent:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=65138:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\NO.Z.10000——javaproject\NO.H.00001.javase\javase\out\production\javase com.yanqi.task15.MapTest
m1 = {}
原来的value数值为:null
m1 = {1=one}
原来的value数值为:null
m1 = {1=one, 2=two}
原来的value数值为:null
m1 = {1=one, 2=two, 3=three}
原来的value数值为:one
m1 = {1=eleven, 2=two, 3=three}
-------------------------------------------------------------
b1 = false
b1 = true
b1 = false
b1 = true
str2 = null
str2 = three
-------------------------------------------------------------
被删除的value是:eleven
m1 = {2=two, 3=three}
-------------------------------------------------------------
2=two
3=three
-------------------------------------------------------------
ts = two
ts = three
-------------------------------------------------------------
2=two
3=three
Process finished with exit code 0
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」