【问题标题】:Using temporary variables to manipulate values in array使用临时变量来操作数组中的值
【发布时间】:2017-03-04 00:26:01
【问题描述】:

假设我有一个包含列 {item, quantity} 的数组。我从 sql 表中获取这些值,然后按项目对它们进行排序。我正在使用临时变量“数量”来操纵双精度值:

while(rs.next()){
   item = rs.getString(1);
   for(int i = 0 ; i < array.size ; i++){
     if(item.equals(array[i][0]){
       double quantity = rs.getDouble(2);
       quantity = quantity + Double.parseDouble(array[i][1]);
       array[i][1] = quantity;
     }
   }
 //add code for adding items if not found in array
}

我的问题是在迭代数组时使用这个临时变量会更慢/创建垃圾吗? Java 是否在 if 语句的末尾正确地处理了这个变量?我之所以这么问,是因为我遇到了堆空间问题,而且我不想重写所有内容来适应这个问题。

我的另一个选择是:

if(item.equals(array[i][0]){
   array[i][1] = String.valueOf(Double.parseDouble(array[i][1]) + rs.getDouble(2));
}

感谢阅读

【问题讨论】:

  • 一个变量不会产生垃圾,也不会变慢。它可能会澄清代码,尤其是在您的情况下,因为该值未命名,因此在这种情况下,名为 quantity 的变量更好。我的意思是,看看你的第二个例子。关于正在发生的事情是非常无信息的。评论可能会有所帮助,但命名良好的变量也是如此。 --- 仅供参考:您的第一个示例缺少String.valueOf() 调用。
  • 说“一个原语变量不会产生垃圾”可能更准确。作为对象的变量将在堆上分配其内存,并且需要进行垃圾回收。
  • @mangotang 不正确。引用变量将引用堆上的一个对象,但该对象不会通过分配给该变量来创建。变量可能只是引用堆上已经存在的对象,所以使用变量不会改变任何东西。
  • @Andreas,我试图避免第二个例子,因为它看起来更混乱;不过,您对第一个示例中的 String.valueOf() 调用是正确的。

标签: java variables garbage-collection heap-memory temporary


【解决方案1】:

它总是会用新值覆盖数量,而旧值当然会保留在数组中。数量不会对你的记忆产生影响,尤其是这是原始的。

如果你要处理复杂类型并且你会做类似的事情,你将在每个循环中覆盖对对象的引用,所以在数组中你将一直引用同一个对象。

【讨论】:

  • 这没什么意义。名为quantity 的变量被声明为inside if 块,因此它的值在循环期间不会被覆盖,因为它只存在于块内。数组值被显式覆盖,因此说“将保留旧值”是错误的。
  • Andreas 是正确的,因为退出 if 块时应该销毁变量。我想知道这个变量是否会以某种方式添加垃圾。 mangotang 是说原始人不会产生垃圾,只有对象会;如果是这种情况,我将需要重写以找到解决我的头部空间问题的方法。
  • 你是对的,我用错了句子,这可能会造成混淆。对于堆大小问题,我可以添加,块内的原始变量在堆栈内存上,而不是在堆中,所以它肯定不会影响你的问题。
猜你喜欢
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 2016-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多