java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Map集合及实现类

一文带你弄清Map集合及其实现类

作者:小威要向诸佬学习呀

在Java中,Map是一种键值对(Key-Value)的集合,它存储了一组唯一的键与相应的值,每个键可以映射到一个值,这篇文章将详细介绍Map集合及其一些常见的实现类,适合小白,感兴趣的同学可以参考阅读

Map接口的一些重要方法:

V get(Object key):返回与指定键相关联的值,如果不存在则返回null。 V put(K key, V value):将指定的键值对存储到Map中,如果键已经存在,则替换对应的值,并返回之前与该键相关联的值;如果键不存在,则直接添加键值对,并返回null。 V remove(Object key):从Map中删除指定键的映射关系,并返回与该键相关联的值,如果键不存在,则返回null。 boolean containsKey(Object key):检查Map是否包含指定的键,如果存在则返回true,否则返回false。 boolean containsValue(Object value):检查Map是否包含指定的值,如果存在则返回true,否则返回false。 int size():返回Map中键值对的数量。 boolean isEmpty():检查Map是否为空,如果为空则返回true,否则返回false。 void clear():清空Map中的所有键值对。 Set keySet():返回Map中所有键的集合。 Collection values():返回Map中所有值的集合。 Set<Map.Entry<K, V>> entrySet():返回Map中所有键值对的集合。

常见的实现Map接口的类有:

HashMap详细介绍

HashMap是Java中的一种数据结构,用于存储键值对。它实现了Map接口,允许我们使用一个特定的键来访问与之关联的值。

HashMap的实现基于哈希表。在哈希表中,每个元素都有一个唯一的索引(哈希码),这个索引可以用来查找对应的值。当我们向HashMap中添加一个新元素时,它会先计算该元素的哈希码,并将其插入到对应位置上。

以下是HashMap类的主要方法:

put(key, value):将指定的键和值添加到Map中。 get(key):返回指定键所映射的值。 remove(key):从Map中删除指定键及其关联的值。 containsKey(key):判断Map是否包含指定键。 keySet():返回Map中所有键组成的Set集合。

需要注意的几点是:

JDK.17和JDK1.8的HashMap有什么区别

JDK 1.7和JDK 1.8都提供了HashMap类,但是它们的实现方式有所不同。下面对这两个版本的HashMap做一个详细的介绍:

JDK 1.7的HashMap

JDK 1.7的HashMap是基于数组和链表组合实现的。HashMap中的每个元素都是一个Entry对象,其中包含了一个key-value对和next指针。当我们往HashMap中添加元素时,程序会根据key的hashCode值计算出元素在数组中的位置,如果该位置还没有存放任何元素,那么直接将新元素放入该位置即可。如果该位置已经存在其他元素,那么它们会被当作一个链表存放在该位置上,新元素会被插入到链表的尾部。当遍历HashMap时,程序会首先根据key的hashCode值确定该元素在数组中的位置,然后遍历该位置上的链表,找到对应的Entry对象。

但是,JDK 1.7的HashMap存在一个很严重的问题,就是在多线程环境下,如果多个线程对HashMap进行并发修改,可能会导致链表成环形而死循环,从而引发程序崩溃。因此,在JDK 1.7中,如果需要在多线程下使用HashMap,我们必须手动实现同步机制。

JDK 1.8的HashMap

JDK 1.8的HashMap也是基于数组和链表组合实现的,但是在实现方式上有了较大的改进。JDK 1.8的HashMap采用了红黑树的数据结构来代替链表,这样可以保证在大量元素存储时,当链表长度超过一定阈值时,将链表转换成红黑树,从而提高查找、添加和删除操作的效率。

同时,JDK 1.8的HashMap还针对并发修改问题进行了优化。它使用了一种叫做**“分段锁”**的机制来代替传统的同步锁,将一个大的HashMap切分成多个小的HashMap,每个小的HashMap都由一个独立的锁进行控制,这样多个线程对不同的小HashMap进行修改时,就不会发生死循环的情况了。

除此之外,JDK 1.8的HashMap还引入了一些新的方法,例如forEach()、replaceAll()等,以便我们更加方便地操作HashMap中的元素。此外,JDK 1.8的HashMap对JDK 1.7的问题进行了修复和优化,因此在实际使用中,推荐尽量使用JDK 1.8的HashMap。

TreeMap详细介绍

TreeMap是Java中的一种数据结构,它实现了NavigableMap接口,而NavigableMap接口又继承了SortedMap接口,它能够根据键值进行排序,并且基于红黑树实现。因此,它保证了插入、删除和查找操作的时间复杂度均为O(logN)。

以下是TreeMap的几个特性:

我们在使用时需要注意以下几点:

Map<String, Integer> map = new TreeMap<>((o1, o2) -> o2.length() - o1.length());

到此这篇关于一文带你弄清Map集合及其实现类的文章就介绍到这了,更多相关Map集合及实现类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文