说我有一个字符串列表或者其他什么。然后说我想在下一段代码中多次使用 ONE 字符串。我应该在以下代码中创建一个新的String变量foo String foo = list.get(position)
并使用foo
,还是应该每次需要使用该字符串时保存内存空间并使用list.get(position)
?或者它们实际上是同样的东西?
如果列表包含一个更复杂的类,可能会进行大量的计算实例化或者本身有很多变量,那么答案是否会改变,因此创建一个新的类会占用大量内存?
答案 0 :(得分:7)
该列表仅包含对其包含的项目的引用,而不包含项目本身。
当您编写SomeObject s = list.get(0);
时,您只需检索对象的引用,并且使用的内存为32位或64位,具体取决于设备。由于get操作非常快(实际上是一个数组访问),答案是它几乎没有差别*(但使用变量可能会稍快一点)。
从可读性的角度来看,通常最好使用额外的变量并给它一个不言自明的名称。
*假设您使用ArrayList:对于其他列表实现,get
的成本可能很高。
答案 1 :(得分:4)
获取一次值,并在用例的生命周期内保留它:
用于保存引用的内存开销是 minimal ,并且小于 N extra list.get(0)
对某些小 N 的调用(可能是2,如果不是1)。当然,成本可能在不同的记忆区域。
list.get(0)
的运行时成本不应该被假定为非常快( O(1))。这种假设基于潜在的ArrayList
;对于LinkedList
,它是 O(N)。
如果您的代码在多线程环境中运行或曾经运行过,那么:
list
可能会在幕后发生变化。
(受保护的)get
的费用会上涨。
正如assylias所提到的,给这个值一个有意义的名字是更好的风格。