Java 为什么';t SparseIntArray实施图<;整数,整数>;?
Android的API文档以以下方式打开: SparseIntArrays将整数映射为整数 那么,我很好奇为什么它没有实现 在我看来,所需要的只是两个不同的方法名,一些琐碎的额外方法,以及一些禁止Java 为什么';t SparseIntArray实施图<;整数,整数>;?,java,android,api,collections,Java,Android,Api,Collections,Android的API文档以以下方式打开: SparseIntArrays将整数映射为整数 那么,我很好奇为什么它没有实现 在我看来,所需要的只是两个不同的方法名,一些琐碎的额外方法,以及一些禁止null键和值的代码。。。当然,没有什么是安不优雅地处理的。我是不是忽略了什么 这并不是要抨击Android API的设计者。通常当我想知道的时候,会有一个很好的理由,我会学到一些关于语言或平台的知识 SparseIntArrays将整数映射为整数。不像普通的数组 整数,索引中可能会有间隙它的目的是 内
null
键和值的代码。。。当然,没有什么是安不优雅地处理的。我是不是忽略了什么
这并不是要抨击Android API的设计者。通常当我想知道的时候,会有一个很好的理由,我会学到一些关于语言或平台的知识 SparseIntArrays将整数映射为整数。不像普通的数组 整数,索引中可能会有间隙它的目的是 内存效率比使用HashMap将整数映射为整数要高, 两者都是因为它避免了自动装箱键和值及其数据 结构不依赖于每个映射的额外条目对象 我们可以得出选择SparseIntArray而不是Map
- 由于我们希望在原语int之间进行映射,因此最好避免自动装箱
- 在Map中,将一个对象作为键/值会带来大量的散列计算、散列冲突的解决、单个bucket中多个条目的链接等。这些都不是必需的,因为我们处理的是原始键/值对。请注意,SparseIntArray附带了性能警告。由于值存储在二进制搜索树数组数据结构中,因此插入和删除操作的成本很高。因此,对于小数据集来说,这是一个很好的选择
- 执行任务非常繁重。您需要像
和entrySet
这样的方法,这在keySet
中是不方便的SparseIntArray
- 贴图关键点是对象,因此需要不断装箱/取消装箱
建议使用其特定的SparseIntArray
和keyAt
以不同的方式通过valueAt
进行枚举,这两种方法都非常快Map
SparseIntArray
implementedMap
您可能会想写:
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击败了你。☺ 谢谢