我试着在不降低处理效率的情况下,用更少的代码行来编写代码。考虑下面的代码:
JSONArray arr = new JSONArray();
for(i = 0; i < 10; i++){
JSONObject main = = new JSONObject();
main.put("RedApples", i);
main.put("GreenApples", i);
arr.add(main);
}
现在我们知道这是一段糟糕的代码,因为JSONObject是在循环中声明的,所以您将声明10个不同的JSONObjects对象,它们将一直保留在内存中,直到代码完成。我们应该在数组外部声明JSONObject,并简单地将其设置在循环内。
现在,关于函数呢?如果在函数内部声明了一个JSONObject,并且该函数被调用了10次,那么该函数是否会将所有10个都保留在内存中,或者当函数结束时,内存会被完全转储吗?我在servlet中使用它。我尝试过搜索它,但与servlet的其余部分相比,很难查找函数内部发生了什么。
发布于 2018-09-28 04:55:18
您在这里混合了几个术语。在您的代码示例中,您不是在创建对象,而是在声明一个原语类型为int
的变量。此变量是在堆栈上创建的。每个变量都有一个作用域,在本例中是循环体。变量的值承诺只在它的作用域内有效,所以当每次迭代结束时,变量不再被使用(它的内存可以回收并用于其他原因)。
方法也是如此-它们声明了一个作用域,在这个作用域中,它们声明的变量是有效的。当函数返回时,声明的变量不再使用,并且可以回收它们的内存。
有关更多信息,请查看Local Variables and Scope
发布于 2018-09-28 05:25:52
首先,你在这里要做的就是所谓的“过早优化”。它是在考虑效率的情况下编写代码,而不是编写可读、简单的代码。这通常会导致代码更难阅读和维护,而且在大多数情况下并不能真正提高程序效率。
如果你想要优化,首先使用一个好的分析器进行分析,然后才开始在你发现热点的地方修改你的代码。
使用JSONObject回答新的代码示例:
因此,您需要一个包含10个以前不存在的不同JSONObjects的JSONArray。创建这10个JSONObjects是无法避免的,这正是您的代码示例所做的。如果您只是在循环外创建一个JSONObject,并在每次循环迭代中将其字段设置为不同的值,那么您最终将得到一个包含10倍相同JSONObject的JSONArray,其中包含来自最新迭代的字段值,因为所有setXXX()
调用都只会修改您创建的单个对象,最后一个集合将取胜。如果您想要10个字段值不同的JSONObjects,则需要10个实例,因为无论您将其添加到某个列表或数组中的频率如何,单个实例只能保存一组值。
https://stackoverflow.com/questions/52544882
复制相似问题