2

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

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

4

2 回答 2

7

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

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

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

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

于 2013-08-04T07:17:59.990 回答
4

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

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

  2. 不应该假设运行时成本非常快(O ( 1 ))。这种假设是基于底层证券;它是O(N)的 a 。list.get(0)ArrayListLinkedList

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

    • list可能会在幕后改变。

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

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

于 2013-08-04T17:05:42.407 回答