Java 为什么';t SparseIntArray实施图<;整数,整数>;?

Java 为什么';t SparseIntArray实施图<;整数,整数>;?,java,android,api,collections,Java,Android,Api,Collections,Android的API文档以以下方式打开: SparseIntArrays将整数映射为整数 那么,我很好奇为什么它没有实现 在我看来,所需要的只是两个不同的方法名,一些琐碎的额外方法,以及一些禁止null键和值的代码。。。当然,没有什么是安不优雅地处理的。我是不是忽略了什么 这并不是要抨击Android API的设计者。通常当我想知道的时候,会有一个很好的理由,我会学到一些关于语言或平台的知识 SparseIntArrays将整数映射为整数。不像普通的数组 整数,索引中可能会有间隙它的目的是 内

Android的API文档以以下方式打开:

SparseIntArrays将整数映射为整数

那么,我很好奇为什么它没有实现

在我看来,所需要的只是两个不同的方法名,一些琐碎的额外方法,以及一些禁止
null
键和值的代码。。。当然,没有什么是安不优雅地处理的。我是不是忽略了什么


这并不是要抨击Android API的设计者。通常当我想知道的时候,会有一个很好的理由,我会学到一些关于语言或平台的知识

SparseIntArrays将整数映射为整数。不像普通的数组 整数,索引中可能会有间隙它的目的是 内存效率比使用HashMap将整数映射为整数要高, 两者都是因为它避免了自动装箱键和值及其数据 结构不依赖于每个映射的额外条目对象

我们可以得出选择SparseIntArray而不是Map的以下原因:

  • 由于我们希望在原语int之间进行映射,因此最好避免自动装箱
  • 在Map中,将一个对象作为键/值会带来大量的散列计算、散列冲突的解决、单个bucket中多个条目的链接等。这些都不是必需的,因为我们处理的是原始键/值对。请注意,SparseIntArray附带了性能警告。由于值存储在二进制搜索树数组数据结构中,因此插入和删除操作的成本很高。因此,对于小数据集来说,这是一个很好的选择
作为补充,我想说JavaDoc应该更具体地说

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

而不是说

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

  • 执行任务非常繁重。您需要像
    entrySet
    keySet
    这样的方法,这在
    SparseIntArray
    中是不方便的

  • 贴图关键点是对象,因此需要不断装箱/取消装箱

  • SparseIntArray
    建议使用其特定的
    keyAt
    valueAt
    以不同的方式通过
    Map
    进行枚举,这两种方法都非常快

如果
SparseIntArray
implemented
Map
您可能会想写:

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

但是,您只能使用
Map
提供的枚举功能。

如果实现
Map
,它必须将
整数
对象作为输入和输出值,而不是原语
int
值,因此该类避免装箱的全部要点都将丢失。

。如果这有助于我假设这是因为实现映射接口将导致繁重的函数(装箱键、创建值集和键集等),而SparseIntArray中定义的函数是为了提高效率而设计的,请选中此复选框。同时使用这两种方法会适得其反。请记住,所有这些方法在map中都是强制性的:(此外,如果您将其称为更高抽象的映射,则不能使用特定于SparseIntArray的函数。使用
size
keyAt
进行迭代的目的是为了比
map
中的
entrySet
更高效,同时也不太方便)对不起,我看不出这是怎么回答这个问题的。好吧,地图界面没有定义引擎盖下的实现是如何工作的,也没有定义它的效率——我相信这就是重点。我可能误解了你的问题。这更多的是SparseIntArray的界面和设计选择。一旦有任何线索,会随时通知你的。是的。question是他们做出这一选择的原因。正如上面的文档所述,它避免了自动装箱,并直接处理原始整数(而不是
Integer
wrappers)。请参阅:@MichaelScheper在对SparseIntArray进行了更多分析后编辑了我的答案。:)第一点:我不同意
entrySet
keySet
不难实现,可以在n时间内运行,如果未使用它们,则不会造成性能损失。第二点:是的,我想这才是真正的答案,但欧姆卡比你先解决了。:-)第三点:这并不能回答为什么。这确实是促使人们质疑非标准API是一种痛苦的原因。是的!但是@Omkar击败了你。☺ 谢谢