【发布时间】:2013-04-13 05:26:23
【问题描述】:
所以,为了性能,我应该use SparseArray instead of HashMap:
但是,SparseArray 不是JCF 的一部分,也没有实现Collection、List 和Map。另一方面,HashMap 实现了Map 并提供了values(),我可以在需要JCF 兼容行为时使用它。例如,在ArrayAdapter 和各种自定义排序(对于值)中使用它。
我的问题有三个:
- 为什么
SparseArray不实现JCF 接口?我是说, 不实现这些接口的动机是什么 鉴于大多数方法已经存在? - 是否有实现JCF 接口的
SparseArray的替代方案 还是可以轻松转换并保留SparseArray的性能? -
HashMaps 有几百个元素真的那么多吗 慢点?我的用户真的会注意到吗?
我正在寻找有深度的答案,我更喜欢参考权威网站。如果您认为您知道为什么 SparseArray 没有使用 JCF 接口实现,请提供一些支持,帮助我理解。如果您认为我应该使用SparseArray,请告诉我如何将它与ArrayAdapter 和自定义排序一起使用(首选Comparator-esque 解决方案)。如果有更好的选择,API 文档、库或教程的链接会很有帮助。如果您认为我应该坚持使用HashMaps,请解释为什么SparseArray 的性能优势被接口的需求所抵消。
【问题讨论】:
-
“具有几百个元素的 HashMap 真的那么慢吗?我的用户真的会注意到吗?” -- 当您创建基准测试并运行测试时,尤其是使用 Traceview 等工具时,您学到了什么?
-
@CommonsWare 我从未“创建过基准”。我到底为什么要这样做?我正在构建一个应用程序,而不是测试集合性能。我已经运行了 Traceview,但我没有参考点来说“这很糟糕”或“这很好”。一切运行良好。我没有什么可以比较它的,因为我从来没有用 SparseArray 构建它。事实上,没有实际的方法可以做到这一点。我所要做的就是告诉我应该使用 SparseArray 的 Lint 警告。我会忽略这些警告吗?我会花时间彻底重构我的代码吗?
-
“我到底为什么要这么做?” ——回答问题:“具有几百个元素的 HashMap 真的那么慢吗?我的用户真的会注意到吗?”没有其他人能够回答这个问题,因为我们不知道您使用
HashMap的方式、地点和时间。 “事实上,没有实际的方法可以做到这一点”——因为你是这个星球上唯一知道你的应用程序的人,我们将不得不从表面上看待它。 “我会忽略那些警告吗?” -- 如果“没有实际的方法”来使用SparseArray,你似乎别无选择。 -
那么你希望任何人都能回答问题#3?如果你不知道他们比什么“慢得多”,我们怎么能?
-
如果你(集体)不能回答#3,那么为什么推荐它?显然,有人知道 SparseArray 是一个性能更好的集合。显然,有人有数据,来自反复暴露的问题,他们可以自信地说我应该使用 SparseArray。显然,他们将建议添加到 ADK 的 Lint 规则中。我发现的唯一数据太模糊,无法确定性能提升是否会影响小型集合。我想从对 SparseArray 有很多了解的人那里得到一个权威的答案,以帮助我在做出重大决定之前找到更多/更好的数据。
标签: android collections sparse-array