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" })]
public class LinkedHashMap : Java.Util.HashMap, IDisposable, Java.Interop.IJavaPeerable, Java.Util.ISequencedMap
[<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
[<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
interface ISequencedMap
- 继承
- 属性
- 实现
注解
接口的 Map 哈希表和链接列表实现,具有明确定义的遇到顺序。 此实现不同于 HashMap 它维护在其所有条目中运行的双重链接列表。 此链接列表定义相遇顺序(迭代顺序),这通常是键插入映射(插入顺序)的顺序。 最近插入最少的条目(长者)是第一个,最年轻的条目是最后一个。 请注意,如果使用该方法 将键重新插入 到映射 put 中,则遇到顺序不会受到影响。 (如果在m.put(k, v)调用时立即返回true,m.containsKey(k)则会将键k重新插入到映射m中。此地图的反向排序视图是相反的顺序,最年轻的条目首先出现,最后显示长项。 可以使用 #putFirst putFirst 和 #putLast putLast 方法更改地图中已有的条目的遇到顺序。
此实现使客户端免于由 HashMap (和 Hashtable) 提供的未指定、通常混乱的排序,而不会产生与 TreeMap它相关的成本增加。 它可用于生成与原始映射相同的顺序的映射副本,而不考虑原始映射的实现:
{@code
void foo(Map<String, Integer> m) {
Map<String, Integer> copy = new LinkedHashMap<>(m);
...
}
}
如果模块在输入上获取映射,复制它,然后返回其顺序由副本确定的结果,则此方法特别有用。 (客户普遍赞赏按相同的顺序返回的东西。
提供了一个特殊 #LinkedHashMap(int,float,boolean) constructor 方法,用于创建一个链接哈希映射,其遇到顺序是上次访问其条目的顺序,从最近访问到最近访问的顺序(访问顺序)。 此类映射非常适合用于生成 LRU 缓存。 调用 put、putIfAbsent、、get、getOrDefaultcompute、 computeIfAbsentcomputeIfPresent或merge方法会导致访问相应的条目(假设调用完成后存在)。 仅 replace 当替换值时,这些方法才会导致对条目的访问。 该方法 putAll 为指定映射中的每个映射生成一个条目访问权限,顺序为指定的映射的条目集迭代器提供键值映射。 没有其他方法生成条目访问权限。 在反向视图中调用这些方法将生成对后盾映射上的条目的访问。 请注意,在反向视图中,对条目的访问将首先按遇到顺序移动。 显式定位方法(例如putFirstlastEntry,无论是在地图上还是在其反向排序视图上),执行定位操作,并且不生成条目访问。 对keySet视图valuesentrySet及其排序的对应项的操作不会影响支持映射的遭遇顺序。
#removeEldestEntry(Map.Entry)在将新映射添加到映射时,可以重写此方法以强制实施策略以自动删除过时映射。 或者,由于“eldest”条目是遇到顺序的第一个条目,因此程序可以通过使用 #firstEntry firstEntry 和 #pollFirstEntry pollFirstEntry 方法检查和删除过时的映射。
此类提供所有可选 Map 和 SequencedMap 操作,并允许 null 元素。 同样HashMap,它为基本操作(以及remove)提供常时性能,containsadd假设哈希函数在存储桶中正确分散元素。 由于维护链接列表的附加费用,性能可能略低于 HashMap该列表,但有一个例外:对集合视图 LinkedHashMap 的迭代需要与地图 大小 成正比的时间,而不考虑其容量。 迭代 HashMap 成本可能更高,需要与 容量成正比的时间。
链接哈希映射有两个影响其性能的参数: 初始容量 和 负载因子。 它们被确切 HashMap地定义为 。 但是,请注意,对于此类 HashMap来说,为初始容量选择过高值的处罚比此类的严重性要低,因为此类的迭代时间不受容量影响。
<强>请注意,此实现未同步。</strong> 如果多个线程同时访问链接哈希映射,并且至少有一个线程在结构上修改映射,则 <它>必须</em> 在外部同步。 这通常是通过在自然封装地图的某些对象上进行同步来实现的。
如果不存在此类对象,则应使用 Collections#synchronizedMap Collections.synchronizedMap 该方法“包装”映射。 最好在创建时完成此操作,以防止意外的未同步访问地图:
Map m = Collections.synchronizedMap(new LinkedHashMap(...));
结构修改是添加或删除一个或多个映射的任何操作,或者在访问排序的链接哈希映射的情况下影响迭代顺序。 在插入排序的链接哈希映射中,仅更改与映射中包含的键关联的值不是结构修改。
<在>访问排序的链接哈希映射中,只需查询映射 get 即可进行结构修改。
</strong>)
由此类集合视图方法返回的集合方法返回iterator的迭代器是 <em>fail-fast</em>:如果在创建迭代器后随时对映射进行结构修改,则迭代器将引发一个ConcurrentModificationException迭代器remove。 因此,面对并发修改,迭代器会在将来不确定的时间快速、干净地失败,而不是冒着任意的不确定行为的风险。
请注意,迭代器的故障快速行为无法保证,一般来说,在出现非同步并发修改时,无法做出任何硬保证。 故障快速迭代器会尽力引发 ConcurrentModificationException 。 因此,编写依赖于此异常的程序的正确性是错误的:迭代 器的故障快速行为应仅用于检测 bug。
由此类的所有集合视图方法返回的集合的拆分器方法返回的拆分器是 <em>late-binding</em>、 <em>fail-fast</em>,以及其他报告 Spliterator#ORDERED。
<em>Note</em>:Android Nougat(API 级别 24 和 25)中的这些拆分器实现使用错误的顺序(与使用正确顺序的迭代器不一致),尽管报告 Spliterator#ORDERED。 可以使用以下代码片段在 API 级别 24 和 25 上获取正确有序的拆分器: <ul><li>For a Collection 视图 c = lhm.keySet(), c = lhm.entrySet() 或者 c = lhm.values()使用 java.util.Spliterators.spliterator(c, c.spliterator().characteristics()) 而不是 c.spliterator()。
<li>而不是c.stream()或c.parallelStream(),用于java.util.stream.StreamSupport.stream(spliterator, false)从此类Spliterator构造 (nonparallel) java.util.stream.Stream 。
</ul> 请注意,这些解决方法仅建议在何处 lhm 提供 LinkedHashMap。
此类是 Java Collections Framework 的成员。
在 1.4 中添加。
Java文档java.util.LinkedHashMap。
本页的某些部分是根据 创建和共享的工作进行的修改,并根据 许可证中所述的条款使用。
构造函数
| 名称 | 说明 |
|---|---|
| LinkedHashMap() |
构造具有默认初始容量(16)和负载因子(0)的空插入有序 |
| LinkedHashMap(IDictionary) |
使用与指定映射相同的映射构造插入排序 |
| LinkedHashMap(Int32, Single, Boolean) |
构造具有指定初始容量、负载因子和排序模式的空 |
| LinkedHashMap(Int32, Single) |
构造具有指定初始容量和负载因子的空插入有序 |
| LinkedHashMap(Int32) |
构造具有指定初始容量和默认负载因子(0)的空插入有序 |
| 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) |
接口的 |
| NewLinkedHashMap(Int32) |
接口的 |
| Notify() |
唤醒正在等待此对象的监视器的单个线程。 (继承自 Object) |
| NotifyAll() |
唤醒正在等待此对象的监视器的所有线程。 (继承自 Object) |
| Put(Object, Object) |
要添加 (继承自 AbstractMap) |
| PutAll(IDictionary) |
要添加 (继承自 AbstractMap) |
| PutFirst(Object, Object) |
要添加 |
| PutIfAbsent(Object, Object) |
接口的 |
| PutLast(Object, Object) |
要添加 |
| Remove(Object, Object) |
从此映射中删除指定键的映射(如果存在)。 (继承自 HashMap) |
| Remove(Object) |
要添加 (继承自 AbstractMap) |
| RemoveEldestEntry(IMapEntry) |
返回 |
| Replace(Object, Object, Object) |
接口的 |
| Replace(Object, Object) |
接口的 |
| ReplaceAll(IBiFunction) |
接口的 |
| Reversed() |
接口的 |
| SequencedEntrySet() |
接口的 |
| SequencedKeySet() |
接口的 |
| SequencedValues() |
接口的 |
| SetHandle(IntPtr, JniHandleOwnership) |
设置 Handle 属性。 (继承自 Object) |
| Size() |
要添加 (继承自 AbstractMap) |
| ToArray<T>() |
接口的 |
| ToString() |
返回对象的字符串表示形式。 (继承自 Object) |
| UnregisterFromRuntime() |
接口的 |
| Values() |
要添加 (继承自 AbstractMap) |
| Wait() |
使当前线程等待,直到唤醒它,通常是通过 em 通知/em< 或 >em<interrupted>/em<。><> (继承自 Object) |
| Wait(Int64, Int32) |
使当前线程等待直到唤醒,通常是通过 <em>通知</em> 或 <em interrupted>/em<>,或直到经过一定数量的实时。 (继承自 Object) |
| Wait(Int64) |
使当前线程等待直到唤醒,通常是通过 <em>通知</em> 或 <em interrupted>/em<>,或直到经过一定数量的实时。 (继承自 Object) |
显式接口实现
| 名称 | 说明 |
|---|---|
| IJavaPeerable.Disposed() |
接口的 |
| IJavaPeerable.DisposeUnlessReferenced() |
接口的 |
| IJavaPeerable.Finalized() |
接口的 |
| IJavaPeerable.JniManagedPeerState |
接口的 |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
接口的 |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
接口的 |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
接口的 |
扩展方法
| 名称 | 说明 |
|---|---|
| GetJniTypeName(IJavaPeerable) |
获取实例 |
| JavaAs<TResult>(IJavaPeerable) |
尝试强制 |
| JavaCast<TResult>(IJavaObject) |
执行 Android 运行时检查的类型转换。 |
| JavaCast<TResult>(IJavaObject) |
接口的 |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
尝试强制 |