Java Map接口及其实现类原理解析
作者:JustinNeil 发布时间:2022-06-04 22:54:29
Map接口
Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value;
Map中的键值对以Entry类型的对象实例形式存在;
建(key值)不可重复,value值可以重复,一个value值可以和很多key值形成对应关系,每个建最多只能映射到一个值。
Map支持泛型,形式如:Map<K,V>
Map中使用put(K key,V value)方法添加
Map接口中定义的常用方法
具体使用在实现类中讨论
int size();//获取Map集合大小(即元素数量)
boolean isEmpty();//判断是否为空
boolean containsKey(Object key);//判断是否包含某个键
boolean containsValue(Object value);//判断是否包含某个值
V get(Object key);//获取某个键对应的值
V put(K key, V value);//添加键值对(K,V)
V remove(Object key);//移除某个键对应的键值对
void putAll(Map<? extends K, ? extends V> m);//添加另一个Map集合
void clear();//清空所有键值对
Set<K> keySet();//获取键的集合
Collection<V> values();//获取值的集合
Set<Map.Entry<K, V>> entrySet();//获取键值对实体的集合
interface Entry<K,V>//Map中的内部接口
HashMap
基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)除实现了Map接口外还实现了Cloneable,Serializable,继承了AbstractMap抽象类
此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
特点:
键无序,唯一,类似于Set集合
值有序,可重复,类似于List
底层数据结构是哈希表,保证键唯一
允许键为null,值为null
// HashMap<String, Student> hm = new HashMap<String, Student>();
// hm.put("2018050401", new Student("2018050401", "张三", 18, 80.0));
// hm.put("2018050402", new Student("2018050402", "李四", 18, 80.0));
// hm.put("2018050403", new Student("2018050403", "李四", 18, 80.0));
// hm.put("2018050404", new Student("2018050404", "王五", 18, 80.0));
// hm.put("2018050404", new Student("2018050404", "王五", 18, 80.0));
//
// // 方式一: 通过键找值
// Set<String> keys = hm.keySet();
// for (String key : keys) {
// Student s = hm.get(key);
// System.out.println(key + "|" + s.getId() + "|" + s.getName() + "|" + s.getAge() + "|" + s.getScore());
// }
HashMap<Student, String> hm = new HashMap<Student, String>();
hm.put(new Student("2018050401", "张三", 18, 80.0),"2018050401");
hm.put(new Student("2018050402", "李四", 18, 80.0),"2018050402");
hm.put(new Student("2018050403", "李四", 18, 80.0), "2018050403");
hm.put(new Student("2018050404", "王五", 18, 80.0), "2018050404");
hm.put(new Student("2018050404", "王五", 18, 80.0), "2018050404");
// 方式二: 通过键值对对象找键找值
Set<Entry<Student, String>> keyValues = hm.entrySet();
for (Entry<Student, String> keyValue : keyValues) {
Student s = keyValue.getKey();
String value = keyValue.getValue();
System.out.println(s.getId() + "|" + s.getName() + "|" + s.getAge() + "|" + s.getScore() + "=" + value);
}
LinkedHashMap
Map 接口的哈希表和链表实现,具有可预知的迭代顺序
特点:
键有序,唯一,
值有序,可重复,类似于List
底层数据结构是哈希表和链表,哈希表保证键唯一,链表保证键有序
LinkedHashMap<Integer, String> lhm = new LinkedHashMap<Integer, String>();
lhm.put(01, "张三1");
lhm.put(02, "张三2");
lhm.put(03, "张三3");
lhm.put(04, "张三4");
lhm.put(05, "张三5");
Set<Integer> keys = lhm.keySet();
for (Integer key : keys) {
System.out.println(key + "|" + lhm.get(key));
}
TreeMap
基于红黑树(Red-Black tree)的 NavigableMap 实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,
具体取决于使用的构造方法。
特点:
键可排序,唯一,
值有序,可重复,类似于List
底层数据结构是自平衡的二叉树,可排序
排序方式类似于TreeSet,分为自然排序和比较器排序,具体取决于使用的构造方法
TreeMap<Integer, String> tm = new TreeMap<Integer, String>();
tm.put(24, "Hello1");
tm.put(14, "Hello2");
tm.put(34, "Hello3");
tm.put(124, "Hello4");
tm.put(24, "Hello5");
tm.put(24, "Hello6");
tm.put(24, "Hello7");
tm.put(244, "Hello8");
tm.put(624, "Hello9");
tm.put(24, "Hello10");
Set<Integer> keys = tm.keySet();
for (Integer key : keys) {
String value = tm.get(key);
System.out.println(key + "|" + value);
}
HashTable
此类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值
特点:
不允许null键和null值
线程安全,效率低
HashMap和Hashtable的区别:
HashMap是不安全的不同步的效率高的 允许null键和null值
Hashtable是安全的同步的效率低的 不允许null键和null值
底层都是哈希表结构
Hashtable<String, String> hashtable = new Hashtable<String, String>();
hashtable.put("刘备", "孙尚香");
hashtable.put("孙策", "大乔");
hashtable.put("周瑜", "小乔");
hashtable.put("吕布", "貂蝉");
System.out.println(hashtable);
Enumeration<String> keys = hashtable.keys();
while (keys.hasMoreElements()) {
String key = keys.nextElement();
String value = hashtable.get(key);
System.out.println(key + "|" + value);
}
WeakHashMap
以弱键 实现的基于哈希表的 Map。在 WeakHashMap 中,当某个键不再正常使用时,将自动移除其条目。更精确地说,对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的丢弃,这就使该键成为可终止的,被终止,然后被回收。
丢弃某个键时,其条目从映射中有效地移除,因此,该类的行为与其他的 Map 实现有所不同。
WeakHashMap<String,String> whm = new WeakHashMap<>();
whm.put(new String("hello1"), "world1");
whm.put(new String("hello2"), "world2");
whm.put(new String("hello3"), "world3");
whm.put("hello4", "world3");
System.out.println(whm);
System.gc();
System.runFinalization();
System.out.println(whm);
键是枚举类型
EnumMap<Direction, String> em = new EnumMap<>(Direction.class);
em.put(Direction.UP, "向上移动");
em.put(Direction.DOWN, "向下移动");
em.put(Direction.LEFT, "向左移动");
em.put(Direction.RIGHT, "向右移动");
Set<Direction> keys = em.keySet();
for (Direction key : keys) {
String value = em.get(key);
System.out.println(key + "|" + value);
}
来源:https://blog.csdn.net/yjn1995/article/details/89784891


猜你喜欢
- 本文实例为大家分享了spring aop注解配置的具体代码,供大家参考,具体内容如下Demo.javapackage cn.itcast.e
- 实现了Java web开发账号单一登录的功能,防止同一账号重复登录,后面登录的踢掉前面登录的,使用过滤器Filter实现的。可以先下载项目下
- 本文实例为大家分享了android实现录屏功能的具体代码,供大家参考,具体内容如下1、mian.activitypackage com.fp
- 引言一个复杂的分布式系统,用户发起一个请求,这个请求可能调用几十到几百个服务,经过很多业务层,而每个业务又是多个机器集群,一个请求具体被随机
- 本文实例讲述了C#定时关闭窗体的方法,分享给大家供大家参考。具体方法如下:public partial class Form2 : Form
- maven配置项目的jdk版本无效排查最近在配置项目的jdk的时候发现在pom.xml中配置的1.8版本无效,maven更新后就变成了1.7
- 一、Mybatis1、mybatis-config.xml<?xml version="1.0" encoding
- 本文主要介绍了java8 stream自定义分组求和并排序的实现,分享给大家,具体如下: public static void
- 本文实例讲述了Java编程实现非对称加密的方法。分享给大家供大家参考,具体如下:对称加密算法在加密和解密时使用的是同一个秘钥;而非对称加密算
- Hystrix Dashboard,它主要用来实时监控Hystrix的各项指标信息。通过Hystrix Dashboard反馈的实时信息,可
- spring Session 提供了一套用于管理用户 session 信息的API和实现。Spring Session为企业级Java应用的
- 项目中遇到springBoot+docker需要配置不同环境变量的问题,做个简单的总结:1.开发环境ide中启动项目可以通过ide的环境变量
- 在开发Android App过程中,经常会遇见这样的功能。从当前的app跳转到一个应用商店并且跳转到自己app的详情页面,让用户给自己的Ap
- OSS不支持通过一个网络地址来上传图片,所以若想将网络上的图片上传到OSS上需要走点弯路。1、通过链接将图片下载到本地的一个文件夹下面2、用
- 源程序揭秘杨辉三角形性质: 每行数字左右对称,由 1 开始逐渐变大,然后变小,回到 1。 第 n 行的数字个数为 n 个。 第 n 行数字和
- 其中定义WIFI AP的几个状态public static final int WIFI_AP_STATE_DISABLING = 10;
- 玩安卓的人都知道adb,玩adb的人都知道install和uninstall,但是为什么adb shell pm install packa
- 本文实例为大家分享了Android仿IOS UIAlertView对话框的具体代码,供大家参考,具体内容如下显示效果:我在参考链接中看到了作
- 说实话,对于xUtils,是我最近才用到的开发框架(也是刚接触),对于其功能不得不说,简化了很多的开发步骤,可以说是非常好的开发
- 最近一直在看RecyclerView,较之ListView它确实是灵活多变,给予开发者更多自定义的空间,比如:需要添加头部和尾部、item的