【问题标题】:Why isn't SparseArray in Android JFC compatible?为什么 Android JFC 中的 SparseArray 不兼容?
【发布时间】:2013-04-13 05:26:23
【问题描述】:

所以,为了性能,我应该use SparseArray instead of HashMap

但是,SparseArray 不是JCF 的一部分,也没有实现CollectionListMap。另一方面,HashMap 实现了Map 并提供了values(),我可以在需要JCF 兼容行为时使用它。例如,在ArrayAdapter 和各种自定义排序(对于值)中使用它。

我的问题有三个:

  1. 为什么SparseArray 不实现JCF 接口?我是说, 不实现这些接口的动机是什么 鉴于大多数方法已经存在?
  2. 是否有实现JCF 接口的SparseArray 的替代方案 还是可以轻松转换并保留SparseArray 的性能?
  3. 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


【解决方案1】:

可能是因为它是 Map 但 SparseArray 有原始键。

替代方案是以前的地图

对于 3,一般来说,是的,但应该衡量一下,看看他的情况是否属实

【讨论】:

  • Map 的自动拆箱会降低性能吗? List 界面呢?
  • 在 Java Puzzlers amazon.com/Java-Puzzlers-Traps-Pitfalls-Corner/dp/032133678X 中,如果我没记错的话,它解释说装箱拆箱确实会影响性能。我可能对此非常错误,但最好检查一下
  • 你能详细说明你的答案吗? #1 我想知道的不仅仅是“也许”(我也可以猜测“也许”)。我正在寻找没有实施 JCF 的充分理由。 #2 我正在寻找现有解决方案之外的替代方案。 #3 如果不完全重写我的大部分代码,我就无法切换到 SparseArray,因此我没有实用的方法来“测量”它。我在这个主题上找到的只是我链接到的一篇文章。我需要更多信息,而不是更多猜测。
  • 没有“也许”。它在文档中详细说明:“它旨在比使用 HashMap 将整数映射到对象更有效。”避免 Integer 不断的装箱和拆箱是它存在的原因。 FWIW,关于 SparseArray 的另一个有趣的部分是它实现了 Cloneable,但它的 clone() 不返回 Object,使其成为协变方法而不是重载。
  • @fadden “避免 Integer 不断的装箱和拆箱是它存在的原因。”这对我来说并不完全清楚。然而,假设它是真的,那只能解释为什么它没有实现 Map。 Collection(或任何有效的子接口)呢,其中 E 是值类型?
【解决方案2】:

SparseArray.java 的第一个版本是在 2006 年 5 月编写的。在某些方面,它早于您所指的各种集合接口(在 Android 中,而不是 Java 中)。我的感觉是它不支持各种 JCF 接口,因为它们在编写代码时并不存在,并且从那以后没有人找到添加它们的理由。 (它甚至直到 2007 年初才使用泛型。)

如果您发现增强的 SparseArray 有用,我们始终欢迎使用高质量的补丁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 2017-02-07
    • 2017-10-08
    • 2014-11-06
    相关资源
    最近更新 更多