Map与HashMap

一、Map

    

1、关系

Map:

  双列数据,存储key-value对的数据 ---类似于高中的函数:y = f(x)

HashMap:

  作为Map的主要实现类;线程不安全的,效率高;存储null的key和value

LinkedHashMap:

  保证在遍历map元素时,可以按照添加的顺序实现遍历。

  原因:在原有的HashMap底层结构基础上,添加了一对指针,指向前一个和后一个元素。

  对于频繁的遍历操作,此类执行效率高于HashMap

TreeMap:

  保证按照添加的key-value对进行排序,实现排序遍历。此时考虑key的自然排序或定制排序

  底层使用红黑树

Hashtable:

  作为古老的实现类;线程安全的,效率低;不能存储null的key和value

Properties:

  常用来处理配置文件。key和value都是String类型

2、概述

  • Map与Collection并列存在。用于保存具有映射关系的数据:key-value
  • Map 中的 key 和 value 都可以是任何引用类型的数据
  • Map 中的 key 用Set来存放,不允许重复,即同一个 Map 对象所对应 的类,须重写hashCode()和equals()方法
  • 常用String类作为Map的“键”
  • key 和 value 之间存在单向一对一关系,即通过指定的 key 总能找到 唯一的、确定的 value
  • Map接口的常用实现类:HashMap、TreeMap、LinkedHashMap和 Properties。其中,HashMap是 Map 接口使用频率最高的实现类

3、结构

  

  • Map中的key:无序的、不可重复的,使用Set存储所有的key ---> key所在的类要重写equals()和hashCode() (以HashMap为例)
  • Map中的value:无序的、可重复的,使用Collection存储所有的value --->value所在的类要重写equals()
  • 一个键值对:key-value构成了一个Entry对象。
  • Map中的entry:无序的、不可重复的,使用Set存储所有的entry

4、常用方法

  

 源码查看:

//将指定key-value添加(修改)到当前map对象中
V put(V key, V value);
//将m中所有key-value对存放到当前map中
void putAll(Map<? extends K, ? extends V> m);
//移除指定key的key-value对,并返回value
V remove(Object key);
//清空当前map中所有数据
void clear();

二、Hashmap

1、概述

  HashMap 也是我们使用非常多的 Collection,它是基于哈希表的 Map 接口的实现,以 key-value 的形式存在。在 HashMap 中,key-value 总是会当做一个整体来处理,系统会根据 hash 算法来来计算 key-value 的存储位置,我们总是可以通过 key 快速地存、取 value。下面就来分析 HashMap 的存取。

2、定义

public class HashMap<K,V> extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable 

  

3、结构

  影响 HashMap 性能的两个重要参数:“initial capacity”(初始化容量)和”load factor“(负载因子)。简单来说,容量就是哈希表桶的个数,负载因子就是键值对 个数与哈希表长度的一个比值,当比值超过负载因子之后,HashMap 就会进行 rehash 操作来进行扩容。 

  HashMap 的大致结构如下图所示,其中哈希表是一个数组,我们经常把数组中的每 一个节点称为一个桶,哈希表中的每个节点都用来存储一个键值对。在插入元素时, 如果发生冲突(即多个键值对映射到同一个桶上)的话,就会通过链表的形式来解 决冲突。因为一个桶上可能存在多个键值对,所以在查找的时候,会先通过 key 的哈希值先定位到桶,再遍历桶上的所有键值对,找出 key 相等的键值对,从而来获 取 value。

  

原文地址:https://www.cnblogs.com/Zzzzn/p/12500099.html