3 回答
TA贡献1802条经验 获得超6个赞
因此,您将声明 10 个不同的 int 对象,这些对象在代码完成之前一直保留在内存中
不,这不是 Java 的工作方式。首先,原始类型的变量,例如int,不是对象。我不知道“直到代码完成”的确切含义,但是int您在循环内声明的变量不会留在循环体之外的内存中。
在循环外声明变量对效率或内存使用几乎没有影响。
请注意,您也可以像这样编写循环,而无需变量:
for(i = 0; i < 10; i++){
setApples(i * 5);
}
但即使这在实践中也几乎与您的原始代码完全相同。
通常不值得担心像这样的微优化。JVM 比大多数程序员意识到的要聪明得多——它包含许多复杂的优化,使您的代码运行得更快。
TA贡献1875条经验 获得超5个赞
首先,您在这里尝试做的事情称为“过早优化”。它是在编写代码时考虑到一些效率,而不是编写可读的、直接的代码。这通常会导致代码更难阅读和维护,并且在大多数情况下并没有真正提高程序效率。
[如果你想优化,首先分析,使用一个好的分析器,然后才开始在你发现热点的地方改变你的代码。]
使用 JSONObject 回答新的代码示例:
因此,您需要一个包含 10 个不同的 JSONObjects 的 JSONArray,这些 JSONObjects 事先不存在。无法避免创建这 10 个 JSONObjects,而这正是您的代码示例所做的。如果您只是在循环外创建一个 JSONObject 并在每次循环迭代中将其字段设置为不同的值,您最终会得到一个包含 10 倍相同 JSONObject 的 JSONArray,以及来自最新迭代的字段值,因为所有setXXX()
调用都将修改您创建的单个对象,最后一组获胜。如果您想要 10 个字段值不同的 JSONObjects,则需要 10 个实例,因为单个实例只能保存一组值,无论您将其添加到某个列表或数组的频率如何。
TA贡献1836条经验 获得超5个赞
您在这里混合了几个术语。在您的代码示例中,您不是在创建对象,而是在声明一个基本类型的变量int
。这个变量是在堆栈上创建的。每个变量都有一个作用域,在这种情况下是循环的主体。变量的值被承诺只在它的范围内有效,所以当每次迭代结束时,变量不再被使用(它的内存可以被回收并用于其他原因)。
方法也是如此——它们声明了一个作用域,在该作用域中,它们声明的变量是有效的。当函数返回时,声明的变量不再使用,它们的内存可以回收。
添加回答
举报