为什么SparseIntArray没有实现Map <integer,integer =“”>?</integer,>

时间:2014-02-28 05:27:23

标签: java android api collections

Android SparseIntArray的API文档随后打开:

  

SparseIntArrays将整数映射到整数。

我很好奇,那么,为什么它没有实现Map<Integer, Integer>

在我看来,所有需要的是一些不同的方法名称,一些简单的额外方法,以及一些禁止null键和值的代码......当然没有EnumMap无法处理恩典。我忽略了什么吗?

这不是要在Android API的设计者处轻扫。通常,当我想知道things like this时,结果证明这是一个很好的理由,我会学习一些语言或平台。

3 个答案:

答案 0 :(得分:3)

SparseIntArray的JavaDoc也说

  

SparseIntArrays将整数映射到整数。不像普通的数组   整数,指数可能存在差距。 意图更多   内存效率高于使用HashMap将整数映射到整数,   因为它避免了自动装箱键和值及其数据   结构不依赖于每个映射的额外条目对象。

我们可以推导出以下原因选择SparseIntArray而不是Map&lt;整数,整数&gt; :

  • 由于我们希望在原始整数之间进行映射,因此最好避免自动装箱。
  • 在Map中,将对象作为键/值会带来哈希计算的沉重,哈希冲突的解析,单个桶中多个条目的链接等等。这些都不是必需的,因为我们处理原始键/值对。请注意,SparseIntArray附带了性能警告。由于值存储在二进制搜索树阵列数据结构中,因此插入和删除将是昂贵的操作。因此,它是小型数据集的理想选择。

作为一个侧面点,我想说JavaDoc应该更具体,说

  

“SparseIntArrays将原始整数映射为整数。”

而不是说

  

“SparseIntArrays将整数映射到整数。”

答案 1 :(得分:1)

  • 实施Map非常繁重。您需要entrySetkeySet等方法,这在[{1}}中不方便。

  • 地图键是对象,因此您需要不断装箱/取消装箱。

  • SparseIntArray使用特定的SparseIntArrayMap建议使用keyAt枚举valueAt的不同方式,这种方式非常快。

    < / LI>

如果SparseIntArray已实施Map<Integer, Integer>,您可能会想写:

Map<Integer, Integer> intMap = new SparseIntArray();

但是,您只会被Map提供的枚举功能所困扰。

答案 2 :(得分:0)

如果它实现了Map<Integer,Integer>,则必须将Integer个对象作为输入和输出值而不是原始int值处理,所以要避免这个类的整个要点拳击会丢失。