当前位置: 首页 > news >正文

【Map】集合总结

一、Map

之前学习的Collection集合体系是单列集合,即一次存取一个元素

  • Map是双列集合,一次存取一对元素,这一对儿称为键值对,key-value,且key是映射到value

  • 所谓键映射到值,是指只能通过键找到值,无法通过值找键

  • Map中键不能重复!值允许重复

  • Map中一个键,只能对应一个值

  • Map是根接口,常用有2个实现类

    • HashMap

    • TreeMap

二、HashMap【重点】

2.1 介绍

  • HashMap是Map的实现,也是键不能重复,值可以重复,只能通过键找值

  • 底层是使用哈希表实现,所以存储的元素是无序的

  • 允许存储null值,null键

  • 不保证线程安全

  • Hashtable是线程安全的,不允许null值null键,除此之外与HashMap一样

2.2 api演示

public class Demo1 {
​public static void main(String[] args) {HashMap<Integer, String> map = new HashMap<>( );map.put(1,"A");map.put(2,"B");map.put(3,"C");map.put(4,"D");
​// 判断是否包含该键System.out.println(map.containsKey(4));// 判断是否包含该valueSystem.out.println(map.containsValue("D"));
​// get(Object key) ,通过键找值的String s = map.get(1);System.out.println("s = " + s);
​System.out.println("删除前:" + map );// V remove(Object key),通过键删除整个键值对String v = map.remove(2);System.out.println("v = " + v);System.out.println("删除后:" + map );
​// 集合大小System.out.println(map.size() );
​// 集合清空map.clear();
​// 集合为空System.out.println(map.isEmpty( ));}
​private static void show1() {// 创建空mapHashMap<Integer, String> map = new HashMap<>( );// 存储// map.put(33,"C");// map.put(33,"C");// map.put(11,"A");// map.put(44,"D");// map.put(22,"B");// map.put(55,"D");
​// 存储元素无序,key不允许重复,value可以重复// System.out.println(map );
​// put方法的返回值,返回的是该键所对应的旧值,如果没有返回nullString a = map.put(1, "A");System.out.println("a = " + a);
​String a2 = map.put(2, "B");System.out.println("a2 = " + a2);
​String a222 = map.put(2, "BBB");// 这个BBB会将之前的B覆盖System.out.println("a222 = " + a222);
​System.out.println(map);}
}

2.3 map的遍历

Map没有直接遍历的手段,但是提供了三种Collection的方式来查看Map,分别

  • 键集(keySet),即集合中只有键

  • 值集(values),即集合中只有值

  • 键值映射集(entrySet),即集合中键值都有

public static void main(String[] args) {HashMap<Integer, String> map = new HashMap<>( );map.put(1, "A");map.put(2, "B");map.put(3, "C");map.put(4, "D");
​// 键集Set<Integer> keySet = map.keySet( );for (Integer key : keySet) {System.out.println(key);}
​// 值集Collection<String> values = map.values( );for (String v : values) {System.out.println(v);}
​// 键值映射集Set<Map.Entry<Integer,String>> entrySet =  map.entrySet();for (Map.Entry<Integer,String> entry: entrySet) {Integer key = entry.getKey( );String value = entry.getValue( );System.out.println(key+"-->"+value );}}

Entry,是Map的内部类,代表的是键值项,即一个Entry对象代表一个键值对对象

这个Entry类中提供了单独获得键,和值的方法 ,例如 getKey(),getValue

2.4 去重原理

  • HashMap只有键能去重

  • 将元素存储在键上,先调用元素的hashcode方法,判断地址值是否相同

    • 如果地址值不同,直接存储

    • 如果地址值相同,再调用equals方法

  • 调用equals方法,如果

    • 结果是true,即相同,不存储

    • 结果是false,即不相同,即存储

2.5 扩容原理[重点]

HashMap初始容量,默认是16,也可以通过构造方法设置初始容量,但是一般不用改

还有一个影响性能的,是加载因子,默认值是0.75

当存储的元素> 0.75(加载因子) * 16(初始容量) ,就要扩容,扩容成2倍


但是,JDK1.8以后,HashMap底层变成有hash表(数组)+链表+红黑树实现

详情: 参考其他资料

这样底层设计的目的是为了查询更快!!!

三、TreeMap

TreeMap,是双列集合,也是键不允许重复

底层是红黑树,会根据存储的键默认进行自然顺序排序,也可以根据创建TreeMap时传入的比较器进行排序

它与我之前写过的treeset几乎一样,这里不再过多介绍

四、LinkedHashMap

LinkedHashMap,保证存储的元素有序(遍历顺序和插入顺序一致),且去重

public static void main(String[] args) {LinkedHashMap<Integer, String> lhm = new LinkedHashMap<>( );lhm.put(3,"C");lhm.put(2,"B");lhm.put(4,"D");lhm.put(5,"E");lhm.put(4,"D");lhm.put(1,"A");lhm.put(1,"A");
​System.out.println(lhm );
​
}

http://www.lryc.cn/news/365709.html

相关文章:

  • SpringBoot实现发送邮件功能
  • 外观数列 ---- 模拟
  • 上心师傅的思路分享(二)
  • 116页 | 2024年中国金融行业网络安全研究报告(免费下载)
  • 基于fabric封装一个简单的图片编辑器(vue 篇)
  • Linux中 .PHONY 和 all 在 Makefile 中的作用
  • Flutter 中的 FlexibleSpaceBar 小部件:全面指南
  • 每天一个数据分析题(三百五十四)-分析报表
  • 卫星通信频段有哪些
  • RobotMaster编程语言:深度探索与实践挑战
  • Ascend训练软件栈了解
  • 官网万词霸屏推广 轻松实现百度万词霸屏源码系统 带完整的安装代码包以及搭建教程
  • Linux 36.3 + JetPack v6.0@jetson-inference之图像分类
  • 重庆公司记账代理,打造专业财务管理解决方案的领先企业
  • transformers 阅读:Llama 模型
  • python绘制piper三线图
  • 咖啡机器人如何精准控制液位流量
  • Go go-redis应用
  • 从混乱到有序:PDM系统如何优化物料编码
  • npm发布自己的插件包
  • Pygame:新手指南与入门教程
  • 动态IP与静态IP的优缺点
  • 上海市计算机学会竞赛平台2024年1月月赛丙组最大的和
  • C++三大特性之继承,详细介绍
  • Python推导式详解
  • stm32中如何实现EXTI线 0 ~ 15与对应IO口的配置呢?
  • Python 短文本匹配,短文本语义相似度,基于大模型的短文本匹配,基于LLMs的短文本语义相似度识别,短文本语义扩充和匹配
  • 提升接口性能方式汇总
  • C++中的常见语法糖汇总
  • TensorFlow Playground神经网络演示工具使用方法详解