【问题标题】:In Java for android which is faster more efficient在 Java for android 中更快更高效
【发布时间】:2013-08-05 02:57:17
【问题描述】:

假设我有一个字符串列表或其他任何东西。然后说我想在下一段代码中多次使用 ONE 字符串。我应该创建一个新的字符串变量 foo String foo = list.get(position) 并在以下代码中使用 foo,还是应该节省内存空间并在每次需要使用该字符串时使用 list.get(position)?或者它们实际上是同一回事?

如果列表包含一个更复杂的类,该类可能会进行大量计算来实例化或本身有很多变量因此创建一个新的类会占用大量内存,那么答案会改变吗?

【问题讨论】:

    标签: java android list arraylist


    【解决方案1】:

    该列表仅包含对其包含的项目的引用,而不是项目本身。

    当您编写SomeObject s = list.get(0); 时,您只需检索对对象的引用,并且使用的内存是 32 位或 64 位,具体取决于设备。而且由于 get 操作非常快(本质上是数组访问),答案是它几乎没有区别*(但使用变量可能会稍微快一些)。

    从可读性的角度来看,通常最好使用一个额外的变量并给它一个不言自明的名称。

    *假设您使用 ArrayList:对于其他列表实现,get 的成本可能很高。

    【讨论】:

    • 我同意从可读性的角度来看,使用中间变量更方便,但是当您使用额外变量时,您会在堆上分配一个额外的对象 - 一个额外的字符串
    • 不,你不知道——正如我在回答中解释的那样,变量是对对象的引用(=指针),而不是对象本身。在String s = "ABC"; String s2 = s; 中只有一个字符串对象,但有两个对它的引用。
    • 如果列表在任何情况下都是跨线程共享的 - 最好获取引用并保留用于即时“用例”。
    • 您的初始分析假定ArrayList,但不适用于LinkedList。只是更好地获取值并持有引用。
    • @RichardSitze 确实如此。
    【解决方案2】:

    获取一次价值,并在您的用例的生命周期中保留它:

    1. 保存引用的内存成本最小,并且小于N额外的字节码成本> 对一些小的 N 调用 list.get(0)(如果不是 1,可能是 2)。当然,成本可能在不同的内存区域。

    2. 不应假定list.get(0)运行时间成本非常快(O(1))。这样的假设是基于潜在的ArrayListLinkedListO(N)

    3. 如果您的代码确实或将来会在多线程环境中运行,那么:

      • list 可能会在幕后发生变化。

      • (受保护的)get 的成本将会上涨。

    4. 正如 assylias 所提到的,给值一个有意义的名称会更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-08
      • 1970-01-01
      • 2013-08-11
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      • 2020-06-18
      • 1970-01-01
      相关资源
      最近更新 更多