Java入门6.2---Map
分类:
JAVA
一、Map集合
- Map与Collection并列存在,用于保存具有映射关系的数据;
- Map中的key和value都可以是任何引用类型的数据;
- Map中的key用Set来存放,不允许重复,即同一个Map对象所对应的类,须重写hashCode()和equals()方法;
- value是可以重复的,使用Collection来存放;
- 一个key-value对构成一个entry(Map,Entry),entry使用Set来存放。
- 常用String类作为Map的“键”;
- key和value之间存在单向一对一关系,即通过指定的key总能找到唯一的、确定的value。
1.Map与Collection的区别
Map集合的特点:将键映射到值的对象,一个映射不能保护重复的键,每个键最多只能映射到一个值。
区别:
- Map集合存储元素是成对出现的,Map的键是唯一的,值是可以重复的;
- Collection集合存储元素是单独出现的,Collection的Set是唯一的,List是可重复的。
要点:
- Map集合的数据结构针对键有效,跟值无关;
- Collection集合的数据结构针对元素有效。
2.Map的功能
二、HashMap(主要实现类)
1.特点
- 底层是散列表+红黑树,初始容量为16,装载因子为0.75,每次扩容2倍;
- 允许为null,存储无序;
- 非同步(HashMap线程不安全,但效率高);
- 散列表容量大于64且链表大于8时,转成红黑树;
- key的哈希值会与该值的高16位做异或操作,进一步增加随机性;
- 当散列表的元素大于容量*装填因子时,会再散列,每次扩容2倍;
- 如果hashCode相同,key不同则替换元素,否则就是散列冲突;key是用Set来做的,不可重复;Value是用Collection来存放的,可重复。一个key-value对,一个Entry,所有的Entry是用Set存放的,也是不可重复的。
- 向HashMap中添加元素时,会调用key所在类的equals()方法,判断两个key是否相同,若相同,则只能添加进后添加的那个元素。
- HashMap键、值均可以为null值
2.遍历
遍历key集 | ![]() |
遍历value集 | |
遍历key-set对 | ![]() |
三、LinkedHashMap
- 底层是散列表+红黑树+双向链表,父类是HashMap;
- 允许为null;
- 使用链表维护添加进Map中的元素,故遍历map时,是按添加的顺序遍历的(有序)。
- 非同步;
- 提供插入顺序和访问顺序两种,访问顺序是符合LRU算法的,一般用于扩展(默认是插入顺序);
- 迭代与初始容量无关(迭代的是维护的双向链表);
- 大多使用HashMap的API,只不过在内部重写了某些方法,维护了双向链表。
四、TreeMap
1.特点
- 底层是红黑树,保证了时间复杂度为log(n);
- 可以对其进行排序,使用Comparator或者Comparable;
- 只要compare或者CompareTo认定该元素相等,那就相等;
- 非同步;
- 自然排序(手动排序),元素不能为null(TreeMap值可以为'null',键不允许)。
- 按照添加进Map中的key的指定属性进行排序。要求,key必须是同一个类的对象。
2.排序
(1)自然排序
默认按key的增序排列
(2)定制排序
五、HashTable
1.特点
- HashTable是个古老的Map实现类,线程安全,不建议使用;
- 与HashMap不同,Hashtable不允许使用null作为key和value;
- 与HashMap一样,Hashtable也不能保证其中key-value对的顺序;
- Hashtable判断两个key相等、两个value相等的标准,与hashMap一致。
2.Properties
常用来处理属性文件,键和值都为String类型的。
六、ConcurrentHashMap
- 底层是散列表+红黑树,支持高并发操作;
- key和value都不能为null;
- 线程是安全的,利用CAS算法和部分操作上锁实现;
- get方法是非阻塞,无锁的,重写node,通过volatile修饰next来实现每次获取都是最新设置的值;
- 在高并发环境下,统计数据(计算size等)其实是无意义的,因为在下一时刻size值就变化了。
参考链接:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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).特征选择---过滤法(特征相关性分析)