如何将HashMap转换/转换为LinkedHashMap?

时间:2016-08-15 14:28:05

标签: java android casting hashmap linkedhashmap

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

我正在尝试在其中存储LinkedHashMap,但出于某些原因,当我从 Hawk 中取回它时,它会以常规HashMap而不是{{}返回{1}}。此时我因LinkedHashMap ClassCastException而崩溃,因此HashMap无法直接投放到LinkedHashMap

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

2 个答案:

答案 0 :(得分:14)

所有答案都表明您可以从LinkedHashMap创建HashMap在技术上是正确的,但不会给您带来预期效果: - (

当然,您可以从LinkedHashMap创建HashMap,但不能保证LinkedHashMap的订单与您原来的订单相同。

问题在于,当LinkedHashMap作为普通无序Map存储到持久存储中时,会对其进行序列化,而不会保留各个项的排序。然后,当您从持久存储中提取对象时,它将以普通HashMap的形式返回,并且它已经丢失了“排序”(这首先是您想要的LinkedHashMap)。如果您随后从返回的LinkedHashMap创建HashMap,则排序很可能与原始排序不同。

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

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

答案 1 :(得分:5)

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

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

Object将是您需要的类型。