为了账号安全,请及时绑定邮箱和手机立即绑定

Java 对象持久性

Java 对象持久性

12345678_0001 2021-10-17 16:55:30
我试图在不损失处理效率的情况下用更少的行编写代码。考虑这个代码: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 的其余部分相比,很难找到函数内部发生的事情。
查看完整描述

3 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

因此,您将声明 10 个不同的 int 对象,这些对象在代码完成之前一直保留在内存中


不,这不是 Java 的工作方式。首先,原始类型的变量,例如int,不是对象。我不知道“直到代码完成”的确切含义,但是int您在循环内声明的变量不会留在循环体之外的内存中。


在循环外声明变量对效率或内存使用几乎没有影响。


请注意,您也可以像这样编写循环,而无需变量:


for(i = 0; i < 10; i++){

    setApples(i * 5);

}

但即使这在实践中也几乎与您的原始代码完全相同。


通常不值得担心像这样的微优化。JVM 比大多数程序员意识到的要聪明得多——它包含许多复杂的优化,使您的代码运行得更快。


查看完整回答
反对 回复 2021-10-17
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

首先,您在这里尝试做的事情称为“过早优化”。它是在编写代码时考虑到一些效率,而不是编写可读的、直接的代码。这通常会导致代码更难阅读和维护,并且在大多数情况下并没有真正提高程序效率。

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

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

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


查看完整回答
反对 回复 2021-10-17
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

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

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


查看完整回答
反对 回复 2021-10-17
  • 3 回答
  • 0 关注
  • 146 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信