美文网首页
集合 Map接口

集合 Map接口

作者: DOB_8199 | 来源:发表于2021-02-05 23:51 被阅读0次

      |----Map接口:双列集合,用来存储一对(key - value)一对的数据    eg:高中函数:y = f(x)

              |----HashMap、LinkedHashMap、TreeMap、Hashtable、Properties

Map接口继承树


Map的实现类的结构

|----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类型

HashMap的底层

        数组+链表  (jdk7及之前)

        数组+链表+红黑树 (jdk 8)

面试题

1. HashMap的底层实现原理?

2. HashMap 和 Hashtable的异同?

3. CurrentHashMap 与 Hashtable的异同?(暂时不讲)

Map结构的理解

*    Map中的key:无序的、不可重复的,使用Set存储所有的key  ---> key所在的类要重写equals()和hashCode() (以HashMap为例)

*    Map中的value:无序的、可重复的,使用Collection存储所有的value --->value所在的类要重写equals()

*    一个键值对:key-value构成了一个Entry对象。

*    Map中的entry:无序的、不可重复的,使用Set存储所有的entry

HashMap的底层实现原理?

以jdk7为例说明:

添加

      HashMap map = new HashMap():

      在实例化以后,底层创建了长度是16的一维数组Entry[] table。

      ...可能已经执行过多次put...

      map.put(key1,value1):

      首先,调用key1所在类的hashCode()计算key1哈希值,此哈希值经过某种算法计算以后,得到在Entry数组中的存放位置。

      如果此位置上的数据为空,此时的key1-value1添加成功。 ----情况1

      如果此位置上的数据不为空,(意味着此位置上存在一个或多个数据(以链表形式存在)),比较key1和已经存在的一个或多个数据的哈希值:

              如果key1的哈希值与已经存在的数据的哈希值都不相同,此时key1-value1添加成功。----情况2

              如果key1的哈希值和已经存在的某一个数据(key2-value2)的哈希值相同,继续比较:调用key1所在类的equals(key2)方法,比较:

                      如果equals()返回false:此时key1-value1添加成功。----情况3

                      如果equals()返回true:使用value1替换value2。

      补充:关于情况2和情况3:此时key1-value1和原来的数据以链表的方式存储。

扩容

      在不断的添加过程中,会涉及到扩容问题,当超出临界值(且要存放的位置非空)时,扩容。默认的扩容方式:扩容为原来容量的2倍,并将原有的数据复制过来。

jdk8 相较于jdk7在底层实现方面的不同:

*      1. new HashMap():底层没有创建一个长度为16的数组

*      2. jdk 8底层的数组是:Node[],而非Entry[]

*      3. 首次调用put()方法时,底层创建长度为16的数组

*      4. jdk7底层结构只有:数组+链表。jdk8中底层结构:数组+链表+红黑树。

*        4.1 形成链表时,七上八下(jdk7:新的元素指向旧的元素。jdk8:旧的元素指向新的元素)

4.2 当数组的某一个索引位置上的元素以链表形式存在的数据个数 > 8 且当前数组的长度 > 64时,此时此索引位置上的所数据改为使用红黑树存储。

*      DEFAULT_INITIAL_CAPACITY : HashMap的默认容量,16

*      DEFAULT_LOAD_FACTOR:HashMap的默认加载因子:0.75

*      threshold:扩容的临界值,=容量*填充因子:16 * 0.75 => 12

*      TREEIFY_THRESHOLD:Bucket中链表长度大于该默认值,转化为红黑树:8

*      MIN_TREEIFY_CAPACITY:桶中的Node被树化时最小的hash表容量:64

LinkedHashMap的底层实现原理(了解)

源码中:

static class Entry<K,V> extends HashMap.Node<K,V> {

Entry<K,V> before, after;//能够记录添加的元素的先后顺序

Entry(int hash, K key, V value, Node<K,V> next) {

super(hash, key, value, next);}}

Map中定义的方法:

添加、删除、修改操作:

Object put(Object key,Object value):将指定key-value添加到(或修改)当前map对象中

void putAll(Map m):将m中的所有key-value对存放到当前map中

Object remove(Object key):移除指定key的key-value对,并返回value

void clear():清空当前map中的所有数据

元素查询的操作:

Object get(Object key):获取指定key对应的value

boolean containsKey(Object key):是否包含指定的key

boolean containsValue(Object value):是否包含指定的value

int size():返回map中key-value对的个数

boolean isEmpty():判断当前map是否为空

boolean equals(Object obj):判断当前map和参数对象obj是否相等

元视图操作的方法:

Set keySet():返回所有key构成的Set集合

Collection values():返回所有value构成的Collection集合

Set entrySet():返回所有key-value对构成的Set集合

遍历Map方法:

总结

常用方法:

添加:put(Object key,Object value)

删除:remove(Object key)

修改:put(Object key,Object value)

查询:get(Object key)

长度:size()

遍历:keySet() / values() / entrySet()

TreeMap

向TreeMap中添加key-value,要求key必须是由同一个类创建的对象

因为要按照key进行排序:自然排序 、定制排序

自然排序

Properties

Properties

LinkedHashMap和HashMap的区别

相关文章

  • Map集合Map<Integer,String> m

    01Map集合概述 A:Map集合概述:我们通过查看Map接口描述,发现Map接口下的集合与Collection接...

  • Map接口

    01Map集合概述 A:Map集合概述:我们通过查看Map接口描述,发现Map接口下的集合与Collection接...

  • 集合详解

    Iterator:迭代器,它是Java集合的顶层接口(不包括 map 系列的集合,Map接口 是 map 系列集合...

  • 三十四、Map接口

    一、Map接口介绍 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储...

  • 08.Map接口的概述

    Map接口概述 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据...

  • 【Java】【集合框架】集合框架(map)

    集合框架(map接口) Map是双列集合的根接口,Collection是单列集合的根接口 Map的键是唯一的,Co...

  • JAVA API-day04

    A Map(接口)集合:

  • Java集合框架之Map

    1 Map集合N016 1.1Map接口 【 • 实现Map接口的集合类用来存储"键-值"映射对。 • JDK...

  • 集合相关

    常见的集合有哪些 Map接口和Collection接口是所有集合框架的父接口

  • Java 进阶:集合框架3

    目录 一、Map 接口1. Map 和 Collection2. Map 接口中的常用方法3. Map 集合遍历—...

网友评论

      本文标题:集合 Map接口

      本文链接:https://www.haomeiwen.com/subject/exegtltx.html