Map接口以及实现类HashMap

简介: Map接口以及实现类HashMap的使用介绍

Map接口

特点

  1. Map与Collection并列存在,用于保存具有映射关系的数据
  2. Map中可以和value可以是任何引用类型的数据,会封装到HashMap$Node对象中
  3. Map中的key不允许重复,value可以重复
  4. Map中的key可以为null,value也可以为空。key只能有一个为null,value可以多个为null
  5. 常用的String类作为Map的key
  6. key和value之间存在单向一对一关系,即可通过指定的key总能找到对应的value。

常用方法

  1. put 添加
  2. remove 根据键删除映射关系
  3. get 根据键获取值
  4. size 获取元素个数
  5. isEmpty 判断个数是否为零
  6. clear 清除
  7. containsKey 查找键是否存在

遍历方法

第一组:先取出所有的key,通过可以取出对应的vaule

1 增强for循环

Set keyset = map.keySet();
for(Object key : keyset){
    sout(map.get(key));
}

2 迭代器

Iterator iterator = keyset.iterator();
while (iterator.hasNext()){
    Object key = iterator.next();
    sout(map.get(key));
}

第二组先把所有的vaules取出

Collection vaules = map.values();

1 增强for循环

//使用所有的Collections使用的遍历方法
for(Object value : values){
    sout(value);
}

2 迭代器

Iterator iterator = keyset.iterator();
while (iterator.hasNext()){
    Object value = iterator.next();
    sout(value);
}

通过EntrySet获取

Set entrySet = map.entrySet();
//EntrySet<Map.Entry<K,V>>

1 增强for循环

for(Object entry : entrySet){
    Map.Entry m = (Map.Entry) entry;
    sout(m.getkey() + m.getValue());
}

2 迭代器

Iterator iterator = entrySet.iterator();
while (iterator.hasNext()){
    Object entry = iterator.next();
    Map.Entry m = (Map.Entry) entry;
    sout(m.getkey() + m.getValue());
}

HashMap小结

  1. Map接口常用实现类:HashMap、HashTable和Properties
  2. HashMap是Map接口使用频率最高的实现类
  3. HashMap是key-value对的方式来存储数据(HashMap$Node类型)
  4. key可以为null,value也可以为空。key只能有一个为null,value可以多个为null
  5. 如果添加key,则会覆盖原有的对
  6. 与HashSet一样,不保证映射的顺序,因为底层是以hash表的方式来存储的
  7. HashMap没有实现同步,因此线程是不安全的

HashMap扩容机制

  1. HashMap底层维护了Node类型的数组table,默认null
  2. 当创建对象时,将加载因子(loadfactor)初始化为0.75
  3. 当添加key-value时,通过key的哈希值得到table的索引,然后判断该索引处是否有元素,没有则直接添加。如果该索引处有元素,继续判断该元素的key和准备加入的key是否相等,如果相等,则替换value;如果不相等需要判断树结构还是链表结构,做出相应处理。如果添加时发现容量不够,则需要扩容
  4. 第一次添加,则需要扩容table容量为16,临界值(threshold)为12
  5. 以后再扩容,则需要table容量为原来的2倍(32),临界值为原来的2倍(24)。
  6. 在java8中,如果一条链表的元素个数超过TREEIFY_THRESHOLD(默认8),并且table的大小>=MIN_TREEIFY_CAPACITY(默认64),就会进行红黑树化
相关文章
|
1月前
|
Java
【Java集合类面试二十二】、Map和Set有什么区别?
该CSDN博客文章讨论了Map和Set的区别,但提供的内容摘要并未直接解释这两种集合类型的差异。通常,Map是一种键值对集合,提供通过键快速检索值的能力,而Set是一个不允许重复元素的集合。
|
1月前
|
JavaScript 前端开发
Vue 系类之 this.tabledatas.map 无效
这篇文章讲述了在Vue项目中使用`this.tabledatas.map`处理接口返回的数组数据时遇到的问题,原因是由于取错了后端返回的数据集合字段值,导致`.map`方法无效,通过检查和修正数据取值解决了问题。
Vue 系类之 this.tabledatas.map 无效
|
1月前
|
算法 Java 索引
【Java集合类面试四】、 描述一下Map put的过程
这篇文章详细描述了HashMap中put操作的过程,包括首次扩容、计算索引、插入数据以及链表转红黑树和可能的再次扩容。
【Java集合类面试四】、 描述一下Map put的过程
|
1月前
|
安全 Java
【Java集合类面试五】、 如何得到一个线程安全的Map?
如何得到一个线程安全的Map的方法包括:使用Collections工具类将Map包装为线程安全,使用java.util.concurrent包下的ConcurrentHashMap,以及不推荐使用性能较差的Hashtable。
|
1月前
|
安全 Java
【Java集合类面试三】、Map接口有哪些实现类?
这篇文章介绍了Java中Map接口的几种常用实现类:HashMap、LinkedHashMap、TreeMap和ConcurrentHashMap,以及它们适用的不同场景和线程安全性。
|
3月前
|
存储 算法 Java
滚雪球学Java(65):深入理解Java中的Map接口:实现原理剖析
【6月更文挑战第19天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
32 3
滚雪球学Java(65):深入理解Java中的Map接口:实现原理剖析
|
3月前
|
存储 编译器 C++
|
2月前
|
Java
Java Map.Entry接口详解
Java Map.Entry接口详解
|
3月前
|
消息中间件 Java 开发工具
消息队列 MQ产品使用合集之topic相同,但是tag不同,这个类不能放入map中,该如何处理
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
3月前
|
存储 安全 Java
《ArrayList & HashMap 源码类基础面试题》面试官们最喜欢问的ArrayList & HashMap源码类初级问,你都会了?
《ArrayList & HashMap 源码类基础面试题》面试官们最喜欢问的ArrayList & HashMap源码类初级问,你都会了?
30 0