LinkedHashMap 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
接口的 Map
哈希表和链接列表实现,具有可预测的迭代顺序。
[Android.Runtime.Register("java/util/LinkedHashMap", DoNotGenerateAcw=true)]
[Java.Interop.JavaTypeParameters(new System.String[] { "K", "V" })]
public class LinkedHashMap : Java.Util.HashMap, IDisposable, Java.Interop.IJavaPeerable
[<Android.Runtime.Register("java/util/LinkedHashMap", DoNotGenerateAcw=true)>]
[<Java.Interop.JavaTypeParameters(new System.String[] { "K", "V" })>]
type LinkedHashMap = class
inherit HashMap
interface IMap
interface IJavaObject
interface IDisposable
interface IJavaPeerable
- 继承
- 属性
- 实现
注解
接口的 Map
哈希表和链接列表实现,具有可预测的迭代顺序。 此实现与 不同 HashMap
之处在于,它维护一个通过其所有条目运行的双链接列表。 此链接列表定义迭代顺序,这通常是键插入映射 (插入顺序) 的顺序。 请注意,如果将键 重新插入 到映射中,则插入顺序不受影响。 k
m
(如果在m.put(k, v)
调用时m.containsKey(k)
立即返回 true
invocation.)
此实现使其客户端免于 (和 Hashtable
) 提供的HashMap
未指定的、通常混乱的排序,而不会增加与 TreeMap
相关的成本。 无论原始映射的实现如何,它都可用于生成与原始映射具有相同顺序的映射副本:
void foo(Map m) {
Map copy = new LinkedHashMap(m);
...
}
如果模块在输入上采用映射,复制它,然后返回其顺序由副本顺序确定的结果,则此方法特别有用。 (客户端通常希望以相同的顺序返回内容。)
提供了一个特殊 #LinkedHashMap(int,float,boolean) constructor
方法,用于创建链接哈希映射,该映射的迭代顺序是上次访问其条目的顺序,从最近访问到最近访问 (访问顺序) 。 这种映射非常适合生成 LRU 缓存。 调用 put
、putIfAbsent
、、get
、getOrDefault
compute
、computeIfAbsent
computeIfPresent
、 或 merge
方法会导致访问相应的条目 (假定它在调用完成) 之后存在。 仅当替换值时,方法 replace
才会导致对条目的访问。 方法 putAll
为指定映射中的每个映射生成一个条目访问权限,其顺序为指定映射的条目集迭代器提供键值映射。 没有其他方法生成条目访问。 特别是,对集合视图的操作 不会影响 支持映射的迭代顺序。
#removeEldestEntry(Map.Entry)
可以重写 方法,以在向映射添加新映射时强制实施策略,以便自动删除过时的映射。
此类提供所有可选 Map
操作,并允许 null 元素。 与 一样HashMap
,它为基本操作提供恒定时间性能, (add
contains
和 remove
) ,假设哈希函数在存储桶中正确分散元素。 性能可能略低于 , HashMap
因为维护链接列表的费用会增加,但有一个例外:迭代 的集合视图 LinkedHashMap
需要与映射 大小 成正比的时间,而不管其容量如何。 迭代的成本可能更高, HashMap
需要与其 容量成正比的时间。
链接哈希映射有两个影响其性能的参数: 初始容量 和 负载因子。 它们被精确 HashMap
定义为 。 但是,请注意,对于此类 HashMap
来说,选择过高值作为初始容量的处罚并不严重,因为此类的迭代时间不受容量影响。
<强>请注意,此实现不同步。</strong> 如果多个线程同时访问链接的哈希映射,并且至少有一个线程在结构上修改了该映射,则必须<<>>在外部同步该映射。 这通常是通过在自然封装映射的某个对象上同步来实现的。
如果不存在此类对象,则应使用 Collections#synchronizedMap Collections.synchronizedMap
方法“包装”映射。 最好在创建时执行此操作,以防止意外对地图进行非同步访问:
Map m = Collections.synchronizedMap(new LinkedHashMap(...));
结构修改是添加或删除一个或多个映射或影响迭代顺序的任何操作。 在插入顺序链接哈希映射中,仅更改与地图中已包含的键关联的值不是结构修改。 <strong>在访问排序的链接哈希映射中,仅使用 get
查询地图是一种结构修改。 </strong>)
由此类的所有集合视图方法返回的集合的 方法返回 iterator
的迭代器为 <em>fail-fast</em>:如果在创建迭代器后随时对映射进行结构修改(除非通过迭代器自己的 remove
方法),则迭代器将引发 ConcurrentModificationException
。 因此,面对并发修改,迭代器会快速且干净地失败,而不会在将来不确定的时间冒着任意、非确定性行为的风险。
请注意,无法保证迭代器的快速故障行为,因为一般来说,在出现非同步并发修改的情况下,不可能做出任何硬性保证。 故障快速迭代器会尽最大努力引发 ConcurrentModificationException
。 因此,编写依赖于此异常的程序的正确性是错误的: 迭代器的快速故障行为应仅用于检测 bug。
由此类的所有集合视图方法返回的集合的拆分器方法返回的拆分器为 <em>late-binding</em>、 <em>fail-fast</em> 以及报告 Spliterator#ORDERED
。 <em>注意</em>:在 Android Nougat (API 级别 24 和 25 中实现这些拆分器) 使用错误的顺序 (与迭代器不一致,迭代器使用正确的顺序) ,尽管报告 Spliterator#ORDERED
。 可以使用以下代码片段在 API 级别 24 和 25 上获取正确排序的c.spliterator()
拆分器:<ul<>li>对于集合视图 c = lhm.keySet()
,c = lhm.entrySet()
或 c = lhm.values()
,请使用 java.util.Spliterators.spliterator(c, c.spliterator().characteristics())
而不是 。 <li>而不是 c.stream()
或 c.parallelStream()
,使用 java.util.stream.StreamSupport.stream(spliterator, false)
从此类 Spliterator
构造 (非并行) java.util.stream.Stream
。 </ul> 请注意,建议仅当 为 LinkedHashMap
时lhm
,才建议这些解决方法。
此类是 Java 集合框架的成员。
在 1.4 中添加。
的 java.util.LinkedHashMap
Java 文档。
此页面的部分内容是基于 创建和共享的工作进行的修改,并根据 署名许可中所述的术语使用。
构造函数
LinkedHashMap() |
构造一个空插入顺序 |
LinkedHashMap(IDictionary) |
使用与指定映射相同的映射构造插入排序 |
LinkedHashMap(Int32) |
构造具有指定初始容量和默认负载因子 (0 的空插入顺序 |
LinkedHashMap(Int32, Single) |
构造具有指定初始容量和负载因子的空插入排序 |
LinkedHashMap(Int32, Single, Boolean) |
构造具有指定初始容量、负载因子和排序模式的空 |
LinkedHashMap(IntPtr, JniHandleOwnership) |
创建 JNI 对象的托管表示形式时使用的构造函数;由运行时调用。 |
属性
Class |
返回此 |
Handle |
基础 Android 实例的句柄。 (继承自 Object) |
IsEmpty |
要添加 (继承自 AbstractMap) |
JniIdentityHashCode |
接口的 |
JniPeerMembers |
接口的 |
PeerReference |
接口的 |
ThresholdClass |
此 API 支持 Mono for Android 基础结构,不应直接从代码使用。 |
ThresholdType |
此 API 支持 Mono for Android 基础结构,不应直接从代码使用。 |
方法
Clear() |
要添加 (继承自 AbstractMap) |
Clone() |
返回此 |
Compute(Object, IBiFunction) |
接口的 |
ComputeIfAbsent(Object, IFunction) |
接口的 |
ComputeIfPresent(Object, IBiFunction) |
接口的 |
ContainsKey(Object) |
要添加 (继承自 AbstractMap) |
ContainsValue(Object) |
要添加 (继承自 AbstractMap) |
Dispose() |
接口的 |
Dispose(Boolean) |
接口的 |
EntrySet() |
返回 |
Equals(Object) |
指示其他某个对象是否“等于”此对象。 (继承自 Object) |
ForEach(IBiConsumer) |
接口的 |
Get(Object) |
要添加 (继承自 AbstractMap) |
GetHashCode() |
返回对象的哈希代码值。 (继承自 Object) |
GetOrDefault(Object, Object) |
接口的 |
JavaFinalize() |
当垃圾回收确定不再引用对象时,由对象上的垃圾回收器调用。 (继承自 Object) |
KeySet() |
要添加 (继承自 AbstractMap) |
Merge(Object, Object, IBiFunction) |
接口的 |
Notify() |
唤醒正在等待此对象的监视器的单个线程。 (继承自 Object) |
NotifyAll() |
唤醒正在等待此对象的监视器的所有线程。 (继承自 Object) |
Put(Object, Object) |
要添加 (继承自 AbstractMap) |
PutAll(IDictionary) |
要添加 (继承自 AbstractMap) |
PutIfAbsent(Object, Object) |
接口的 |
Remove(Object) |
要添加 (继承自 AbstractMap) |
Remove(Object, Object) |
从此映射中删除指定键的映射(如果存在)。 (继承自 HashMap) |
RemoveEldestEntry(IMapEntry) |
|
Replace(Object, Object) |
接口的 |
Replace(Object, Object, Object) |
接口的 |
ReplaceAll(IBiFunction) |
接口的 |
SetHandle(IntPtr, JniHandleOwnership) |
设置 Handle 属性。 (继承自 Object) |
Size() |
要添加 (继承自 AbstractMap) |
ToArray<T>() |
接口的 |
ToString() |
返回对象的字符串表示形式。 (继承自 Object) |
UnregisterFromRuntime() |
接口的 |
Values() |
要添加 (继承自 AbstractMap) |
Wait() |
导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>。<> (继承自 Object) |
Wait(Int64) |
导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>,或直到经过一定数量的实时。<> (继承自 Object) |
Wait(Int64, Int32) |
导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>,或直到经过一定数量的实时。<> (继承自 Object) |
显式接口实现
IJavaPeerable.Disposed() |
接口的 |
IJavaPeerable.DisposeUnlessReferenced() |
接口的 |
IJavaPeerable.Finalized() |
接口的 |
IJavaPeerable.JniManagedPeerState |
接口的 |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
接口的 |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
接口的 |
IJavaPeerable.SetPeerReference(JniObjectReference) |
接口的 |
扩展方法
JavaCast<TResult>(IJavaObject) |
执行 Android 运行时检查的类型转换。 |
JavaCast<TResult>(IJavaObject) |
接口的 |
GetJniTypeName(IJavaPeerable) |
接口的 |