java currentmap 匹配value 删除 java删除map key_java map获取第一个值


Map:map提供了一个更通用的元素存储方法。Map集合类用于存储元素对(称之“键”和“值”),其中每个键映射到一个值。从概念上来讲,可以将List看作是具有数值键的Map.而实际上,除了List和Map都定义在java.util中外,两者并没有直接的联系。

了解Map接口和方法

Java核心类中有很多预定义的Map类。在介绍具体实现之前,我们先介绍一下Map接口本身,以便了解所有实现的共同点。Map接口定义了四种类型的方法,每个Map都包含这些方法。

equals(Object o) 比较指定对象与此Map的等价性

hashCode() 返回此Map的哈希码

Map构建

Map定义了几个用于插入和删除元素的变换方法

clear() 从Map中删除所有映射

remove(Object key) 从Map中删除键和关联的值

put(Object key,Object value) 将指定值与指定键相关联

remove(Object key) 从Map中删除映射

putAll(Map t) 将指定Map中的所有映射复制到此map

假设构建一个需要传递给putAll()的Map的开销,使用putAll()通常也并不比使用大量的put()

调用更有效率,但putAll()的存在一点也不稀奇。这是因为,putAll()除了迭代put()所执行的将每个键值对添加到Map的算法之外,还需要迭代所传递的Map的元素。但应注意,putAll()

在添加所有元素之前可以正确调整Map的大小,因此如果未亲自调整Map的大小。则putAll()

可能比预期的更有效。

查看Map

迭代Map中的元素不存在直接的方法.如果要查询某个Map以了解其哪些元素man满足特定查询,或如果要迭代其所有元素,则首先需要获取该Map的”视图”.有三种可能的视图

所有键值对—参见entrySet()

所有键—参加KeySet()

有值—参见values()

前两个视图均返回Set对象,第三个视图返回Collection.就这两种情况而言,问题并没有解决,这是因为无法直接迭代Collection对象或者Set对象,要进行迭代,必须获得一个Iterator对象.因此,要迭代Map元素,必须进行比较繁琐的编码,值得注意的是,这些对象(Set,Collection和Itrator)实际上是基础Map的视图,而不是包含所有元素的副本.这使得他们的使用效率很高.另一方面,Collection或Set对象的toArray()方法却创建包含Map所有元素的数组对象,因此除了确定需要使用数组中的元素的情形外,其效率并不高.

访问元素

Map通常适合按键(而非按值)进行访问.

get(Object key) 返回与指定键关联 的值

containKey(Object key) 如果Map包含指定键的映射,则返回true

containVaule(Object value) 如果此Map将一个或者多个键映射到指定值,则返回true

isEmpty() 如果Map不包含键-值映射,则返回true

size() 返回Map中的键-值的数目

核心Map

Java自带了各种Map类.这些Map类可归为三种类型:

  1. 通用Map,用于应用程序中管理映射,通常在java.util程序包中实现

HashMap

Hashtable

properties

LinkedHashMap

IdentityHashMap

TreeMap

WeakHashMap

ConcurrentHashMap

2.专用Map,您通常不必亲自创建此类Map,而是通过某些其他类对其进行访问

java.util.jar.Attributes
javax,print.attrubute.standard.PrinteraSrateReasons
java.securty.Provider
java.awt.RenderingHints
javax.swing.UIDefaults

3.一个用于帮助实现您自己的Map类的抽象类

AbstractMap

内部哈希:哈希映射技术

几乎所有通用的Map都使用哈希映射.这是一种将元素映射到数组的非常简单的机制,应了解哈希映射的而工作原理,以便充分利用Map

哈希映射结构由一个储存元素的内部数组组成.由于内部采用数组存储,因此必然存在一个用于确定任意键访问数组的索引机制.实际上,该机制需要提供一个小于数组大小的整数索引值.该机制称作哈希函数.在Java基于哈希的Map中,哈希函数将对象转换为一个适合内部数组的整数.这样就可以不必再为寻找一个易于使用的哈希函数而大伤脑筋:每个对象豆瓣韩一个返回整数值得hashCode()方法.要将该值映射到数组,只需要将其转化为一个正值;然后在将该值除以数组大小后取余数即可.


java currentmap 匹配value 删除 java删除map key_java map数组_02


该图介绍了哈希映射的基本原理,但我们还没有对其进行详细详细介绍.哈希函数将任意对象映射到一个数组位置,但如果两个不同的键映射到相同的位置,情况将会如何?这是一种必然发生的情况.在哈希映射的术语中,称之为冲突.map处理这些冲突的方法是在索引位置处插入一个链接列表,并简单地将元素添加到此链接列表.因此,一个基于哈希的Map的基本put()方法可能如下所示

public Object put(Object key, Object value) {
 //我们的内部数组是一个 Entry 对象数组
 //Entry[] table;
 //获取哈希码,并映射到一个索引
 int hash = key.hashCode();
 int index = (hash & 0x7FFFFFFF) % table.length;
 //循环遍历位于 table[index] 处的链接列表,以查明
 //我们是否拥有此键项 — 如果拥有,则覆盖它
 for (Entry e = table[index] ; e != null ; e = e.next) {
 //必须检查键是否相等,原因是不同的键对象
 //可能拥有相同的哈希
 if ((e.hash == hash) && e.key.equals(key)) {
 //这是相同键,覆盖该值
 //并从该方法返回 old 值
 Object old = e.value;
 e.value = value;
 return old;
 }
 }
 //仍然在此处,因此它是一个新键,只需添加一个新 Entry
 //Entry 对象包含 key 对象、 value 对象、一个整型的 hash、
 //和一个指向列表中的下一个 Entry 的 next Entry
 //创建一个指向上一个列表开头的新 Entry,
 //并将此新 Entry 插入表中
 Entry e = new Entry(hash, key, value, table[index]);
 table[index] = e;
 return null;
}

此外,还有一些需要进一步考虑的事项,如处理空键和值以及调整内部数组…..