Java入门6.2---Map

一、Map集合

  1. Map与Collection并列存在,用于保存具有映射关系的数据;
  2. Map中的key和value都可以是任何引用类型的数据;
  3. Map中的key用Set来存放,不允许重复,即同一个Map对象所对应的类,须重写hashCode()和equals()方法;
  4. value是可以重复的,使用Collection来存放
  5. 一个key-value对构成一个entry(Map,Entry),entry使用Set来存放。
  6. 常用String类作为Map的“键”;
  7. key和value之间存在单向一对一关系,即通过指定的key总能找到唯一的、确定的value。

1.Map与Collection的区别

Map集合的特点:将键映射到值的对象,一个映射不能保护重复的键,每个键最多只能映射到一个值。

区别:

  1. Map集合存储元素是成对出现的,Map的键是唯一的,值是可以重复的;
  2. Collection集合存储元素是单独出现的,Collection的Set是唯一的,List是可重复的。

要点:

  1. Map集合的数据结构针对键有效,跟值无关;
  2. Collection集合的数据结构针对元素有效。

2.Map的功能

 

二、HashMap(主要实现类)

1.特点

  1. 底层是散列表+红黑树,初始容量为16,装载因子为0.75,每次扩容2倍;
  2. 允许为null,存储无序
  3. 非同步(HashMap线程不安全,但效率高)
  4. 散列表容量大于64且链表大于8时,转成红黑树;
  5. key的哈希值会与该值的高16位做异或操作,进一步增加随机性;
  6. 当散列表的元素大于容量*装填因子时,会再散列,每次扩容2倍;
  7. 如果hashCode相同,key不同则替换元素,否则就是散列冲突;key是用Set来做的,不可重复;Value是用Collection来存放的,可重复。一个key-value对,一个Entry,所有的Entry是用Set存放的,也是不可重复的。 
  8. 向HashMap中添加元素时,会调用key所在类的equals()方法,判断两个key是否相同,若相同,则只能添加进后添加的那个元素。
  9. HashMap键、值均可以为null值

2.遍历

遍历key集
遍历value集
遍历key-set对

三、LinkedHashMap

  1. 底层是散列表+红黑树+双向链表,父类是HashMap;
  2. 允许为null
  3. 使用链表维护添加进Map中的元素,故遍历map时,是按添加的顺序遍历的(有序)。
  4. 非同步;
  5. 提供插入顺序和访问顺序两种,访问顺序是符合LRU算法的,一般用于扩展(默认是插入顺序);
  6. 迭代与初始容量无关(迭代的是维护的双向链表);
  7. 大多使用HashMap的API,只不过在内部重写了某些方法,维护了双向链表。

四、TreeMap

1.特点

  1. 底层是红黑树,保证了时间复杂度为log(n);
  2. 可以对其进行排序,使用Comparator或者Comparable;
  3. 只要compare或者CompareTo认定该元素相等,那就相等;
  4. 非同步;
  5. 自然排序(手动排序),元素不能为null(TreeMap值可以为'null',键不允许)。
  6. 按照添加进Map中的key的指定属性进行排序。要求,key必须是同一个类的对象。

2.排序

(1)自然排序

默认按key的增序排列

(2)定制排序

 

五、HashTable

1.特点

  1. HashTable是个古老的Map实现类,线程安全,不建议使用;
  2. 与HashMap不同,Hashtable不允许使用null作为key和value
  3. 与HashMap一样,Hashtable也不能保证其中key-value对的顺序;
  4. Hashtable判断两个key相等、两个value相等的标准,与hashMap一致。

2.Properties

常用来处理属性文件,键和值都为String类型的。 

六、ConcurrentHashMap

  1. 底层是散列表+红黑树,支持高并发操作;
  2. key和value都不能为null;
  3. 线程是安全的,利用CAS算法和部分操作上锁实现;
  4. get方法是非阻塞,无锁的,重写node,通过volatile修饰next来实现每次获取都是最新设置的值;
  5. 在高并发环境下,统计数据(计算size等)其实是无意义的,因为在下一时刻size值就变化了。

 

 

 

参考链接:

【1】Java Map按Value排序 - 简书

【2】TreeMap升序|降序排列和按照value进行排序

【3】深入探究Java中hashCode()和equals()的关系 - 炭烧生蚝 - 博客园

【4】什么时候重写hashcode与equals_kdkxkxnccb的博客

posted @   nxf_rabbit75  阅读(151)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
历史上的今天:
2019-07-02 3(1).特征选择---过滤法(特征相关性分析)
一、Map集合1.Map与Collection的区别2.Map的功能二、HashMap(主要实现类)1.特点2.遍历三、LinkedHashMap四、TreeMap1.特点2.排序五、HashTable1.特点2.Properties六、ConcurrentHashMap
点击右上角即可分享
微信分享提示