在Java for android中更快更有效率

时间:2013-08-04 07:10:43

标签: java android list arraylist

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

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

2 个答案:

答案 0 :(得分:7)

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

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

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

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

答案 1 :(得分:4)

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

  1. 用于保存引用的内存开销 minimal ,并且小于 N extra list.get(0)对某些小 N 的调用(可能是2,如果不是1)。当然,成本可能在不同的记忆区域。

  2. list.get(0)运行时成本不应该被假定为非常快( O(1))。这种假设基于潜在的ArrayList;对于LinkedList,它是 O(N)

  3. 如果您的代码在多线程环境中运行或曾经运行过,那么:

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

    • (受保护的)get的费用会上涨。

  4. 正如assylias所提到的,给这个值一个有意义的名字是更好的风格。