我在我的应用程序中使用Hawk替代SharedPreferences
。
我正在尝试在其中存储LinkedHashMap
,但出于某些原因,当我从 Hawk 中取回它时,它会以常规HashMap
而不是{{}返回{1}}。此时我因LinkedHashMap
ClassCastException
而崩溃,因此HashMap
无法直接投放到LinkedHashMap
。
所以问题是如何将返回的HashMap
转换为LinkedHashMap
?
答案 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
将是您需要的类型。