Map家族

目录

一. 前言

二. 实现类

2.1. HashMap

2.2. LinkedHashMap

2.3. ConcurrentHashMap

2.4. TreeMap

2.5. Hashtable

2.6. WeakHashMap

2.7. IdentityHashMap

2.8. EnumMap

2.9. ConcurrentSkipListMap

2.10. ConcurrentReferenceHashMap


一. 前言

        Map是一个顶级接口类,该类没有继承任何其他接口。该类中存储的是<K,V>结构的键值对,并且K一定是唯一的,不能重复。

二. 实现类

2.1. HashMap

无序、不重复、无索引;非线程安全
HashMap跟HashSet的底层原理是一摸一样的,都是哈希表结构。

详情请参见《HashMap 源码解析》

2.2. LinkedHashMap

有序、不重复、无索引;
这里的有序指的是保证存储和取出的元素顺序一致;
原理:底层数据结构依然是哈希表,只是每个键值对元素又额外的多了一个双链表的机制记录存储的顺序。

详情请参见《LinkedHashMap 源码解析》

2.3. ConcurrentHashMap

线程安全的HashMap。

JDK1.7:基于分段锁实现
JDK1.8:采用synchronized + CAS + 红黑树来实现

2.4. TreeMap

TreeMap实现了SortMap()接口,基于红黑树对所有key进行排序。
排序方式:自然排序和定制排序。
TreeMap的key以TreeSet的方式存储,对key的要求与TreeSet对元素的要求大体一致。

 详情请参见《TreeMap 源码解析》

2.5. Hashtable

线程安全,key不允许为null,性能较HashMap低。目前一般不推荐使用。

2.6. WeakHashMap

WeakHashMap是一种弱引用的map,底层数据结构为数组+链表,内部的key存储为弱引用,在GC时如果key不存在强引用的情况下会被回收掉,而对于value的回收会在下一次操作map时回收掉,所以WeakHashMap适合缓存处理。

详情请参见《WeakHashMap 源码解析》

2.7. IdentityHashMap

IdentityHashMap与HashMap类似,IdentityHashMap也允许使用null,但不能保证键值对顺序。

区别:
IdentityHashMap使用==来判断key是否相等,HashMap使用equals来判断key是否相等。

2.8. EnumMap

EnumMap是一个Map,但是它的key是enum类型的。这个map的size有最大值,就是enum的个数。

2.9. ConcurrentSkipListMap

简单来说ConcurrentSkipListMap是TreeMap的并发实现,但是为什么没有称之为ConcurrentTreeMap呢?这和其自身的实现有关。该类是SkipLists的变种实现,提供了Log(n)的时间开销:containsKey、get、put、remove。Insertion, removal, update, and access等操作都是线程安全的。迭代器是弱一致性的,升序迭代器比降序的快。该map的size方法不是常量时间开销,需要遍历,所以这个值在并发的时候可能不准。该map也不允许空键或值。

2.10. ConcurrentReferenceHashMap

1. 支持高并发,基于分段锁实现,性能优于Hashtable
2. 和ConcurrentHashMap设计约束一致,但是支持key和value都为null
3. 默认引用方式为弱引用,非常适合用来做缓存
4. 发生gc的时候,任何时候的缓存对象有可能会被回收,相当于有一个线程在删除内存中的对象

任务描述 本关任务:定义四种开发中常用的集合并添加数据。 相关知识 为了完成本关任务,你需要掌握: 1.集合的体系结构; 2.如何创建常见的集合。 在前两个关卡中我们学习的ArrayList集合只是集合的一个部分,Java中的集合可没那么简单呢,Java中的集合是一个大家族,接下来我们就来见识一下这个家族吧。 集合的体系结构 Java中的集合分为两大家族,一个是Collection家族,Collection家族有三大成员:List、Queue、Set,这三大成员有三个子类(实际还有很多,这里不一一列举)分别是,ArrayList,LinkedList,HashSet,这个家族有一个特点,那就是他们都是单身,集合中的元素都是独立存在的。 另一个就是Map家族了,这个家族的特点就是他们都是成双成对(key和value)一起出现的,让Collection家族很是羡慕啊^_^。 如何使用常见的集合 创建LinkedList集合,并添加数据 LinkedList list = new LinkedList(); list.add("hello"); 创建HashSet集合,并添加数据 HashSet set = new HashSet(); set.add("hello"); 创建HashMap集合,并添加数据 HashMap map = new HashMap(); map.put("name","张三"); 以上就是创建几个常用集合创建实例并添加数据的方式,可以看到我们使用的方式除了LinkedList之外都是父类的引用指向子类对象,相信你还不陌生,这个我们在学习多态这个知识点的时候讲过,这种方式可以大大的提高程序的可扩展性。 通过上述代码可以发现Map集合添加数据和Collection家族成员添加数据的方式不一样,Map集合添加数据必须有两个,即一个是Key一个是Value。 面试官 Duang Duang Duang面试官来啦,快坐好,摆好姿势。 好了,我要开始提问了: 问:Set集合与List集合有什么区别呢? 答:Set集合中的数据不可重复,数据是无序的,List集合的数据可以重复,数据是有序的。 问:就没啦?[严肃脸] 答:哦哦,还有,Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变,List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变。 问:Map集合中的元素可以重复吗? 答:不可以! 问:你说一说,LinkedList和ArrayList的区别吧。 答:好嘞,LinkedList集合增删速度更快,ArrayList改查更快。 问:咳咳咳,下一位! 答:诶诶诶,别呀,我还没说完呢: ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。LinkedList是双向链表。 对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 面试官:嗯,这次算你过关,等下次通知吧! 我:...... 编程要求 请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下: 分别定义HashSet、ArrayList、LinkedList、HashMap集合。并向每一个集合中添加www.educoder.net,Map集合的key设置为address,最后将每一个集合返回。 测试说明 补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。 测试输入:无 预期输出: www.educoder.net www.educoder.net www.educoder.net www.educoder.net package step3; import java.util.ArrayList; import java.util.HashSet; import java.util.Set; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; public class HelloWorld { public HashSet getHashSet(){ /********** Begin **********/ /********** End **********/ } public ArrayList getArrayList(){ /********** Begin **********/ /********** End **********/ } public LinkedList getLinkedList(){ /********** Begin **********/ /********** End **********/ } public Map getHashMap(){ /********** Begin **********/ /********** End **********/ } }
03-18
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流华追梦

你的鼓励将是我创作最大的动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值