首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java对象持久性

Java对象持久性
EN

Stack Overflow用户
提问于 2018-09-28 04:45:58
回答 2查看 43关注 0票数 0

我试着在不降低处理效率的情况下,用更少的代码行来编写代码。考虑下面的代码:

代码语言:javascript
复制
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的其余部分相比,很难查找函数内部发生了什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-28 04:55:18

您在这里混合了几个术语。在您的代码示例中,您不是在创建对象,而是在声明一个原语类型为int的变量。此变量是在堆栈上创建的。每个变量都有一个作用域,在本例中是循环体。变量的值承诺只在它的作用域内有效,所以当每次迭代结束时,变量不再被使用(它的内存可以回收并用于其他原因)。

方法也是如此-它们声明了一个作用域,在这个作用域中,它们声明的变量是有效的。当函数返回时,声明的变量不再使用,并且可以回收它们的内存。

有关更多信息,请查看Local Variables and Scope

票数 0
EN

Stack Overflow用户

发布于 2018-09-28 05:25:52

首先,你在这里要做的就是所谓的“过早优化”。它是在考虑效率的情况下编写代码,而不是编写可读、简单的代码。这通常会导致代码更难阅读和维护,而且在大多数情况下并不能真正提高程序效率。

如果你想要优化,首先使用一个好的分析器进行分析,然后才开始在你发现热点的地方修改你的代码。

使用JSONObject回答新的代码示例:

因此,您需要一个包含10个以前不存在的不同JSONObjects的JSONArray。创建这10个JSONObjects是无法避免的,这正是您的代码示例所做的。如果您只是在循环外创建一个JSONObject,并在每次循环迭代中将其字段设置为不同的值,那么您最终将得到一个包含10倍相同JSONObject的JSONArray,其中包含来自最新迭代的字段值,因为所有setXXX()调用都只会修改您创建的单个对象,最后一个集合将取胜。如果您想要10个字段值不同的JSONObjects,则需要10个实例,因为无论您将其添加到某个列表或数组中的频率如何,单个实例只能保存一组值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52544882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档