java-集合-Map(双列)——迪迦重制版,2021Java开发社招面试解答之性能优化

3、举例:

4、创建Map集合的对象:

5、所有方法:

6、Map注意事项:

二、HashMap(让我们来具体看看这Map星云把我迦迷得不要不要的小妖精)

1、盖亚!!!(无不无聊…)…概述:

2、可惜,我迦不是我迪啊,呵呵,大威天龙!!!(看法宝):

3、只是终究还是错付了,我迪还是受不鸟辣么的诱惑,实在是给得太多了。所以,注意了,这些事情早知道,早…快乐!(注意注意):

4、方法代码实例,让我们呼唤光吧,净化那丑陋的一切:

三、人间体大古,为了人界和平,再次使命召来,让我们高举代码,呼唤,光!!(案例怪兽来了)

四、我们要永远相信光,当黑暗来临,那个人,总会出现在你身旁!


引言

==

神说,“要有光…”

大古,“迪迦!!!”

bang的一拳锤在了神的脸上,“就是你天天喊?不知道我很忙吗,刚被绑架才被放出来,看着你们这些人就很不爽。装神弄鬼…”

拍了拍身上,虽然也没什么灰。

“要光去Map…嗯,是Map吧?去Map星云找去。闲的…”(谁也不知道我重复了三遍吧?)

说完,转过身纵身一跃,

“嚓~~”的一声,化为一道流光飞走了。

----------------------

众所周知,奥特曼分为人间体与变身后的奥特曼之体。所以,今天我们来详细说说,这Map星云的万千异象。

一:Map星云,集合(概要!!!,,,哦,不是,喊错了,盖亚!!!)

==================================

不要意思,盖亚今天不上班,都是我!

1、盖亚?(概要):


Interface Map    K:键的类型;V:值的类型。

2、技能(特点):


将键映射到值的对象;

不能包含重复的键;

每个键可以映射到最多一个值。

3、举例:


Map中对应的key与value:

“大古” , “迪迦奥特曼”

“高山” , “盖亚奥特曼”

“李向阳” , “帝皇侠”

4、创建Map集合的对象:


多态的方式

具体的实现类HashMapHashTable、ConcurrentHashMap、TreeMap、LinkedHashMap、weakHashMap…(说些常用的)


5、所有方法:


    • | Modifier and Type | 方法 | 描述 |
    | --- | --- | --- |
    | `void` | `[clear]( )​()` | 
    从该地图中删除所有的映射(可选操作)。
     |
    | `default [V]( )` | `[compute]( )​([K]( ) key, [BiFunction]( ) remappingFunction)` | 
    尝试计算指定键的映射及其当前映射值(如果没有当前映射,则 `null` )。
     |
    | `default [V]( )` | `[computeIfAbsent]( )​([K]( ) key, [Function]( ) mappingFunction)` | 
    如果指定的键尚未与值相关联(或映射到 `null` ),则尝试使用给定的映射函数计算其值,并将其输入到此映射中,除非是 `null` 。
     |
    | `default [V]( )` | `[computeIfPresent]( )​([K]( ) key, [BiFunction]( ) remappingFunction)` | 
    如果指定的密钥的值存在且非空,则尝试计算给定密钥及其当前映射值的新映射。
     |
    | `boolean` | `[containsKey]( )​([Object]( ) key)` | 
    如果此映射包含指定键的映射,则返回 `true` 。
     |
    | `boolean` | `[containsValue]( )​([Object]( ) value)` | 
    如果此映射将一个或多个键映射到指定的值,则返回 `true` 。
     |
    | `static  [Map.Entry]( )` | `[entry]( )​(K k, V v)` | 
    返回包含给定键和值的不可变[Map.Entry]( ) 。
     |

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

     | `[Set]( )<[Map.Entry]( )<[K]( ),[V]( )>>` | `[entrySet]( )​()` | 
    返回此地图中包含的映射的[Set]( )视图。
     |
    | `boolean` | `[equals]( )​([Object]( ) o)` | 
    将指定的对象与此映射进行比较以获得相等性。
     |
    | `default void` | `[forEach]( )​([BiConsumer]( ) action)` | 
    对此映射中的每个条目执行给定的操作,直到所有条目都被处理或操作引发异常。
     |
    | `[V]( )` | `[get]( )​([Object]( ) key)` | 
    返回指定键映射到的值,如果此映射不包含该键的映射,则返回 `null` 。
     |
    | `default [V]( )` | `[getOrDefault]( )​([Object]( ) key, [V]( ) defaultValue)` | 
    返回指定键映射到的值,如果此映射不包含该键的映射,则返回 `defaultValue` 。
     |
    | `int` | `[hashCode]( )​()` | 
    返回此地图的哈希码值。
     |
    | `boolean` | `[isEmpty]( )​()` | 
    如果此映射不包含键值映射,则返回 `true` 。
     |
    | `[Set]( )<[K]( )>` | `[keySet]( )​()` | 
    返回此地图中包含的键的[Set]( )视图。
     |
    | `default [V]( )` | `[merge]( )​([K]( ) key, [V]( ) value, [BiFunction]( ) remappingFunction)` | 
    如果指定的键尚未与值相关联或与null相关联,则将其与给定的非空值相关联。
     |
    | `static  [Map]( )` | `[of]( )​()` | 
    返回一个包含零映射的不可变地图。
     |
    | `static  [Map]( )` | `[of]( )​(K k1, V v1)` | 
    返回包含单个映射的不可变地图。
     |
    | `static  [Map]( )` | `[of]( )​(K k1, V v1, K k2, V v2)` | 
    返回包含两个映射的不可变地图。
     |
    | `static  [Map]( )` | `[of]( )​(K k1, V v1, K k2, V v2, K k3, V v3)` | 
    返回包含三个映射的不可变地图。
     |
    | `static  [Map]( )` | `[of]( )​(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4)` | 
    返回包含四个映射的不可变地图。
     |
    | `static  [Map]( )` | `[of]( )​(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5)` | 
    返回一个包含五个映射的不可变地图。
     |
    | `static  [Map]( )` | `[of]( )​(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6)` | 
    返回包含六个映射的不可变地图。
     |
    | `static  [Map]( )` | `[of]( )​(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7)` | 
    返回包含七个映射的不可变地图。
     |
    | `static  [Map]( )` | `[of]( )​(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8)` | 
    返回包含八个映射的不可变地图。
     |
    | `static  [Map]( )` | `[of]( )​(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9)` | 
    返回包含九个映射的不可变地图。
     |
    | `static  [Map]( )` | `[of]( )​(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10)` | 
    返回包含十个映射的不可变地图。
     |
    | `static  [Map]( )` | `[ofEntries]( )​([Map.Entry]( )... entries)` | 
    返回包含从给定条目提取的键和值的不可变地图。
     |
    | `[V]( )` | `[put]( )​([K]( ) key, [V]( ) value)` | 
    将指定的值与该映射中的指定键相关联(可选操作)。
     |
    | `void` | `[putAll]( )​([Map]( ) m)` | 
    将指定地图的所有映射复制到此映射(可选操作)。
     |
    | `default [V]( )` | `[putIfAbsent]( )​([K]( ) key, [V]( ) value)` | 
    如果指定的键尚未与值相关联(或映射到 `null` )将其与给定值相关联并返回 `null` ,否则返回当前值。
     |
    | `[V]( )` | `[remove]( )​([Object]( ) key)` | 
    如果存在(从可选的操作),从该地图中删除一个键的映射。
     |
    | `default boolean` | `[remove]( )​([Object]( ) key, [Object]( ) value)` | 
    仅当指定的密钥当前映射到指定的值时删除该条目。
     |
    | `default [V]( )` | `[replace]( )​([K]( ) key, [V]( ) value)` | 
    只有当目标映射到某个值时,才能替换指定键的条目。
     |
    | `default boolean` | `[replace]( )​([K]( ) key, [V]( ) oldValue, [V]( ) newValue)` | 
    仅当当前映射到指定的值时,才能替换指定键的条目。
     |
    | `default void` | `[replaceAll]( )​([BiFunction]( ) function)` | 
    将每个条目的值替换为对该条目调用给定函数的结果,直到所有条目都被处理或该函数抛出异常。
     |
    | `int` | `[size]( )​()` | 
    返回此地图中键值映射的数量。
     |
    | `[Collection]( )<[V]( )>` | `[values]( )​()` | 
    返回此地图中包含的值的[Collection]( )视图。
     |

6、Map注意事项:


  • Map接口提供了三个_集合视图_ ,允许将映射的内容视为一组键,值的集合或键值映射集合。 地图的_顺序_被定义为其中在地图上的集合视图迭代返回元素的顺序。 一些地图实现,如TreeMap类,对其顺序做出特定的保证; 其他人,像HashMap类,不要。
注意:如果使用可变对象作为地图键,必须非常小心。 如果对象的值以影响`equals`比较的方式更改,而对象是地图中的键,则不会指定映射的行为。 这个禁令的一个特殊情况是,地图不允许将自己包含在内。 虽然地图可以将其本身作为一个值,但建议您非常小心: `equals`和`hashCode`方法在这样的地图上已经不太明确。
所有通用映射实现类应提供两个“标准”构造函数:一个创建空映射的void(无参数)构造函数和一个具有类型为`Map`的单个参数的构造函数,它创建一个具有相同键值的新映射映射作为参数。 实际上,后一个构造函数允许用户复制任何地图,产生所需类的等效地图。 没有办法强制执行此建议(因为接口不能包含构造函数),而JDK中的所有通用映射实现都符合要求。
如果此映射不支持此操作,则此接口中包含的“破坏性”方法(即修改其操作的映射的方法)将被指定为抛出`UnsupportedOperationException` 。 如果是这种情况,如果调用对地图没有影响,这些方法可能可以但不是必须抛出`UnsupportedOperationException` 。 例如,在不可修改的地图上调用[putAll(Map)]( )")方法可能会将其映射为“叠加”的地图空白时,但不是必须抛出异常。
一些地图实现对它们可能包含的键和值有限制。 例如,一些实现禁止空键和值,有些对键的类型有限制。 尝试插入不合格的键或值会引发未经检查的异常,通常为`NullPointerException`或`ClassCastException` 。 尝试查询不合格键或值的存在可能会引发异常,或者可能只是返回false; 一些实现将展现出前者的行为,一些实现将展现出后者。 更一般来说,尝试对不符合条件的密钥或值的操作,其完成不会导致将不合格元素插入到地图中可能会导致异常或可能成功执行该选项。 此异常在此接口的规范中标记为“可选”。
Collections Framework接口中的许多方法都是按照[equals]( )方法进行定义的。 例如, [containsKey(Object key)]( )")方法的规范说:“当且仅当此映射包含`k`的映射关系`true`时才返回`(key==null ? k==null : key.equals(k))` 。 该规范_不_应该被解释为意味着调用`Map.containsKey`与非空参数`key`会导致`key.equals(k)`被调用的任意键`k` 。 实现可以自由地实现优化,从而避免`equals`调用,例如,首先比较两个密钥的哈希码。 ( [Object.hashCode()]( )")规范保证具有不等的哈希码的两个对象不能相等。)更一般地,各种Collections Framework接口的实现可以随意利用底层的[Object]( )方法的指定行为,无论执行者认为合适。
执行递归遍历地图的一些地图操作可能会失败,并且地图直接或间接包含自身的自引用实例有异常。 这包括`clone()` , `equals()` , `hashCode()`和`toString()`方法。 实现可以可选地处理自引用场景,然而大多数当前实现不这样做。

二、HashMap(让我们来具体看看这Map星云把我迦迷得不要不要的小妖精)

======================================

1、盖亚!!!(无不无聊…)…概述:


“不好意思…我不无聊!!”

  • HashMap是基于哈希表的实现的Map接口。 该实现提供了所有可选的映射操作,并允许null值和null密钥。 ( HashMap类大致相当于Hashtable ,除了它是不同步的,并允许null)。这个类不能保证地图的顺序; 特别是,它不能保证订单在一段时间内保持不变。

HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。

HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步。

HashMap 是无序的,即不会记录插入的顺序。

HashMap 继承于AbstractMap,实现了 Map、Cloneable、java.io.Serializable 接口。

“只要我足够强,谁来都没用!Map星云都是我的。”

“来啊,造作啊,来哇,快活啊。”

2、可惜,我迦不是我迪啊,呵呵,大威天龙!!!(看法宝):


    • | Modifier and Type | 方法 | 描述 |
    | --- | --- | --- |
    | `void` | `[clear]( )​()` | 
    从这张地图中删除所有的映射。
     |
    | `[Object]( )` | `[clone]( )​()` | 
    返回此 `HashMap`实例的浅拷贝:键和值本身不被克隆。
     |
    | `[V]( )` | `[compute]( )​([K]( ) key, [BiFunction]( ) remappingFunction)` | 
    尝试计算指定密钥及其当前映射值的映射(如果没有当前映射,则 `null` )。
     |
    | `[V]( )` | `[computeIfAbsent]( )​([K]( ) key, [Function]( ) mappingFunction)` | 
    如果指定的键尚未与值相关联(或映射到 `null` ),则尝试使用给定的映射函数计算其值,并将其输入到此映射中,除非 `null` 。
     |
    | `[V]( )` | `[computeIfPresent]( )​([K]( ) key, [BiFunction]( ) remappingFunction)` | 
    如果指定的密钥的值存在且非空,则尝试计算给定密钥及其当前映射值的新映射。
     |
    | `boolean` | `[containsKey]( )​([Object]( ) key)` | 
    如果此映射包含指定键的映射,则返回 `true` 。
     |
    | `boolean` | `[containsValue]( )​([Object]( ) value)` | 
    如果此映射将一个或多个键映射到指定的值,则返回 `true` 。
     |
    | `[Set]( )<[Map.Entry]( )<[K]( ),[V]( )>>` | `[entrySet]( )​()` | 
    返回此地图中包含的映射的[Set]( )视图。
     |
    | `void` | `[forEach]( )​([BiConsumer]( ) action)` | 
    对此映射中的每个条目执行给定的操作,直到所有条目都被处理或操作引发异常。
     |
    | `[V]( )` | `[get]( )​([Object]( ) key)` | 
    返回指定键映射到的值,如果此映射不包含键的映射,则返回 `null` 。
     |
    | `[V]( )` | `[getOrDefault]( )​([Object]( ) key, [V]( ) defaultValue)` | 
    返回指定键映射到的值,如果此映射不包含该键的映射,则返回 `defaultValue` 。
     |
    | `boolean` | `[isEmpty]( )​()` | 
    如果此映射不包含键值映射,则返回 `true` 。
     |
    | `[Set]( )<[K]( )>` | `[keySet]( )​()` | 
    返回此地图中包含的键的[Set]( )视图。
     |
    | `[V]( )` | `[merge]( )​([K]( ) key, [V]( ) value, [BiFunction]( ) remappingFunction)` | 
    如果指定的键尚未与值相关联或与null相关联,则将其与给定的非空值相关联。
     |
    | `[V]( )` | `[put]( )​([K]( ) key, [V]( ) value)` | 
    将指定的值与此映射中的指定键相关联。
     |
    | `void` | `[putAll]( )​([Map]( ) m)` | 
    将指定地图的所有映射复制到此地图。
     |
    | `[V]( )` | `[putIfAbsent]( )​([K]( ) key, [V]( ) value)` | 
    如果指定的键尚未与值相关联(或映射到 `null` )将其与给定值相关联并返回 `null` ,否则返回当前值。
     |
    | `[V]( )` | `[remove]( )​([Object]( ) key)` | 
    从该地图中删除指定键的映射(如果存在)。
     |
    | `boolean` | `[remove]( )​([Object]( ) key, [Object]( ) value)` | 
    仅当指定的密钥当前映射到指定的值时删除该条目。
     |
    | `[V]( )` | `[replace]( )​([K]( ) key, [V]( ) value)` | 
    只有当目标映射到某个值时,才能替换指定键的条目。
     |
    | `boolean` | `[replace]( )​([K]( ) key, [V]( ) oldValue, [V]( ) newValue)` | 
    仅当当前映射到指定的值时,才能替换指定键的条目。
     |
    | `void` | `[replaceAll]( )​([BiFunction]( ) function)` | 
    将每个条目的值替换为对该条目调用给定函数的结果,直到所有条目都被处理或该函数抛出异常。
     |
    | `int` | `[size]( )​()` | 
    返回此地图中键值映射的数量。
     |
    | `[Collection]( )<[V]( )>` | `[values]( )​()` | 
    返回此地图中包含的值的[Collection]( )视图。
     |

3、只是终究还是错付了,我迪还是受不鸟辣么的诱惑,实在是给得太多了。所以,注意了,这些事情早知道,早…快乐!(注意注意):


HashMap的键和值的类型可以是String类型,也可以是其他数据的包装类类型

Map集合的元素的添加并不是Collection集合的add()方法,而是Put()方法。

Map的遍历也不再是for循环或是while循环去integer迭代什么了,而是用到两种新的遍历方式,通过keySet或是entrySet的方法。

只是终究,噩梦都会到来,再美好的一切,都会失去,哭也没用了:

4、方法代码实例,让我们呼唤光吧,净化那丑陋的一切:


 

让我们来整一个全局观,测试测试这些方法。

你可能感兴趣的:(程序员,面试,java,后端)