【问题标题】:Creating a temporary reference, vs reusing? which is better?创建临时参考,还是重用?哪个更好?
【发布时间】:2015-01-04 00:51:05
【问题描述】:

假设我有一个方法我调用了多次(比如说每次应用程序运行 10 个平均数)。

我遍历一个列表,找到一个具有正确 ID 的元素,然后将该元素作为参数传递给另一个方法。

这个引用是我每次用新元素更新的类的字段(成员),还是我只是创建一个新的临时引用,这有什么区别吗?下面的代码示例

for (element e : list) {
    if (e.getID() == searchID) {
        //reassigning value of the reference in the class
        mElementToRemove = e;
        break;
        }
 }
 list.remove(mElementToRemove);

VS.

 for (element e : list) {
    if (e.getID() == searchID) {
        //(new reference)
        Element mElementToRemove = e;
        break;
        }
 }
 list.remove(mElementToRemove);

也许在哪种风格更好或哪种性能更好方面没有区别?

谢谢!

*编辑。我打错了底部的例子。对于完整的上下文,我的意思是:

 private void removeThisId(int searchID) {
 Element ElementToRemove = e; 
 for (element e : list) {
    if (e.getID() == searchID) {
        //(new reference)
        mElementToRemove = e;
        break;
        }
 }
 list.remove(mElementToRemove);

}

【问题讨论】:

  • (new reference) 是什么意思 - 这只是评论吗?引用是指局部变量?
  • 本意是评论,打字太快了,抱歉。是的,我想这将是一个局部变量,但它不是原始变量,它是对列表中对象的引用。
  • 当您可以同时使用两者时,请始终选择局部变量而不是字段。它们更快、更容易推理并且不太可能导致错误。您使用字段的方法具有竞争条件、内存泄漏并且不可重入。使用局部变量可以避免所有这些,而不会增加成本。
  • 第一个和第三个的代码是相同除了你的评论...而第二个不起作用...

标签: java performance object reference coding-style


【解决方案1】:

在第二个示例中,Element 将在循环结束时超出范围,因此甚至无法编译。

您是否考虑过使用Iterator

for(Iterator<Element> i = list.iterator(); i.hasNext(); ) {
     if(i.next().getId() == searchID) {
         i.remove();
     }
}

无并发修改错误,无需声明临时变量。

如果保证您在 List 中最多只有一个 searchID(为什么不使用 Set?),那么您可以通过在 remove 调用后插入 break; 来提前退出。

【讨论】:

  • 感谢托德的帮助。我并不是要在那么小的范围内声明。列表内部是对象,在这种情况下,它们是包含字符串标题、int id 和 int usageNumber 的 IconSet。我目前正在获取 IconSet,然后调用它的 getId() 方法来返回它的 id 并与搜索 ID 进行比较。
  • 那里,改成我认为你正在使用的。
  • 迭代器接口看起来很方便。我想这就是我要做的。看起来很干净,风格很好。谢谢托德。
  • 就定期删除而言,我同意 Todd 的 iterator-解决方案。但是,您还应该考虑覆盖 equals,因为 ID 字段似乎是您的 Element-class 的标识符。如果您可以覆盖equals,则可以使用常规删除。
  • 你是个天才。好的。感谢托德和米多。
【解决方案2】:

Premature optimization is the root of all evil - Donald Knuth

在您的情况下,上述意思是,除非您有令人信服的理由进行优化,否则不要考虑优化。

【讨论】:

  • 我以前听说过。总的来说,我对一个原则点更好奇,而不是在这个特定的例子中。是创建临时引用还是覆盖作为类成员的引用更好,还是根本没有区别。
猜你喜欢
  • 2013-06-24
  • 1970-01-01
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 2010-11-08
  • 1970-01-01
相关资源
最近更新 更多