如何convert/cast HashMap转LinkedHashMap?

How to convert/cast HashMap to LinkedHashMap?

我在我的应用程序中使用 Hawk 替代 SharedPreferences

我试图在其中存储一个 LinkedHashMap,但出于某种原因,当我将其从 Hawk 中拉回时,它 returns 作为常规HashMap 而不是 LinkedHashMap。在这一点上,我崩溃了 ClassCastException 因为 HashMap 不能直接转换为 LinkedHashMap

所以问题是如何将返回的 HashMap 转换为 LinkedHashMap

只需创建一个新的 LinkedHashMap,因为它可以将任何 Map 作为构造函数参数。

LinkedHashMap<Object> newMap = new LinkedHashMap<>(theHashMapReturnedFromHawk);

Object 就是您需要的类型。

LinkedHashMap 的一个构造函数接受 Map。它将 return 一个 LinkedHashMapHashMap 内容相同。

代码示例:

LinkedHashMap<T> newMap = new LinkedHashMap<T>(hashmap);

其中 T 是存储在 HashMap

中的对象的类型

所有建议您可以从 HashMap 创建 LinkedHashMap 的答案在技术上都是正确的,但不会给您想要的结果:-(

当然,您可以从 HashMap 创建 LinkedHashMap,但不能保证 LinkedHashMap 的顺序与原始顺序相同。

问题在于,当您的 LinkedHashMap 作为普通无序 Map 存储到持久存储中时,它会被序列化,这不会保留单个项目的顺序。然后,当您从持久存储中提取对象时,它作为普通的 HashMap 返回,并且它丢失了 "ordering"(这正是您首先想要的 LinkedHashMap ).如果您随后从返回的 HashMap 创建一个 LinkedHashMap,排序很可能与原始顺序不同。

为了正确执行此操作,您可能应该将 LinkedHashMap 转换为有序的对象数组,并将此有序数组存储在持久存储中。然后,您可以从持久存储中读回有序的对象数组,并以正确的顺序重新创建 LinkedHashMap。基本上,您需要自己序列化和反序列化 LinkedHashMap

有关详细信息,请参阅 my answer to this question