集合源码解读之Map

集合(二)

今天讲一讲集合Map的源码:

首先Map是一个键值组合的集合,由key和value存储数据,其下有

Hashtable、LinkedHashMap 、HashMap和TreeMap;

Map集合也是一个容器,同样可以用来存储引用数据类型的边长数据,但是,主要用于存储具有映射关系的数据,因此,map中的元素只能是以键和值对的形式存储

键:key

值:value

键和值之间存在着单向一一对应的关系【通过指定的key,就可以找到一个唯一的值】

特点

  1. 排重的【键对应一个值,不允许键的重复,也不允许一个键对应多个值】通过键排重,依靠的是hashCode和equals方法
  2. 无序的
  3. 底层存储采用的数据结构是哈希算法
  4. 键和值都是引用数据类型,键和值度可以为null

HashMap的工作原理:HashMap是基于哈希算法实现的,其中通过put和get方法分别添加和获取元素,通过键的对象的equals方法找到正确的键值对,然后返回值的对象

如图,Map接口的脉络图

在这里插入图片描述

1.HashMap:
public class HashMap<K,V> extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable {..}
  • HashMap是在平时使用较多的Map实现类,它是继承AbstractMap和实现Map集合的,它底层是哈希表结构,保证了键的唯一性。
    特点:无序,线程不安全,查询速度快,允许null值(key和value都允许)。

其方法部分如下:

1.public boolean containsKey(Object key){}//是否包含key
2.public V put(K key, V value){}//添加键值
3.public void putAll(Map<? extends K, ? extends V> m){}//添加Map集合
4.public V remove(Object key){}//移除key对应的那条数据
5.public boolean containsValue(Object value){}//是否存在value的Map
6.public V get(Object key){}//根据key获取value
7.public Set<K> keySet(){}//返回一个set集合
8.public Set<Map.Entry<K,V>> entrySet(){}//返回以map为参数的set集合
2.Hashtable:
public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable{..}
  • HashTable是继承Dictionary抽象类,并实现Map接口的,其用法与HashMap相似,不过对于HashMap来说,其线程是安全,为此执行效率要比HashMap要慢,因其是同步运行的;Hashtable不允许有null的键值,否则会报空指针异常;

其方法部分如下:(注意其方法都是带synchronized)

1.public synchronized boolean isEmpty(){}//判断是否为空
2.public synchronized boolean contains(Object value){}//判断是否存在值,为空会报空指针
3.public synchronized V get(Object key){}//根据key获取value
4.public synchronized V put(K key, V value){}//添加数据记录
5.public synchronized V remove(Object key){}//移除一条数据
6.public synchronized String toString(){}//toString
7.public synchronized void replaceAll(BiFunction<? super K, ? super V, ? extends V> function)//替换所有
8.public synchronized boolean remove(Object key, Object value){}//根据键值来移除元素
3.LinkedHashMap:
public class LinkedHashMap<K,V>
    extends HashMap<K,V>
    implements Map<K,V>{..}
  • LinkedHashMap是继承HashMap,并实现Map接口,所以说HashMap有的东西,LinkedHashMap也有;但是相对于LinkedHashMap来说它的底层是hash表和链表的实现,具有可预知的迭代顺序;由hash表保证键的唯一性,不可重复,存储和取出的顺序一致;
1.public boolean containsValue(Object value){..}//是否包含值
2.public V get(Object key) {..}//根据key获取值
3.public Set<K> keySet(){..}//keySet方法返回Set<K>集合
4.public Set<Map.Entry<K,V>> entrySet(){..}//不多讲
4.TreeMap
public class TreeMap<K,V>
    extends AbstractMap<K,V>
    implements NavigableMap<K,V>, Cloneable, java.io.Serializable{..}
public interface NavigableMap<K,V> extends SortedMap<K,V>{..}
public interface SortedMap<K,V> extends Map<K,V> {..}
  • TreeMap也是继承AbstractMap,但实现的接口比较少见,NavigableMap间接的实现Map接口;TreeMap是有序的,根据其键(key)按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。TreeMap不允许key的值为null且非同步的;其底层是二叉树结构,即键是红黑树结构,保证了键的唯一性;
1.private final Comparator<? super K> comparator;//定义了比较器
2.public TreeMap(Comparator<? super K> comparator) {this.comparator = comparator;}//构造方法里参入了比较器,保证其有序性
3.public boolean containsKey(Object key){..}//键对应的数据是否存在
4.public boolean containsValue(Object value) {..}//值对应的数据是否存在
5.public K firstKey(){..}//返回第一个key
6.public K lastKey(){..}//返回最后一个key
7.final Entry<K,V> getEntry(Object key){..}//根据指定key,比较器比较去寻找指定节点,找不到返回null

到这里简单的源码就差不多了,如果感兴趣的其实可以再深挖的,只是最近比较忙,抽点时间总结一些简单的方法吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值