【问题标题】:Java performance avoid creating new in loopJava 性能避免在循环中创建新的
【发布时间】:2012-01-17 07:02:41
【问题描述】:

我有这样的代码

Map<String, List> searchMap = new HashMap<String, List>();
for(int i=0; i<something.size(); i++){
 List<String> list = new ArrayList<String>();
 list = getResult(...);
 ...
 searchMap.put(differentkey, list);
}

每次我在循环中创建新列表。如何避免在循环中创建新列表。

【问题讨论】:

  • 我们无法从您的代码中看出您在做什么(i 是为了什么?getResult 是什么?)。很明显,= new ArrayList&lt;String&gt; ();\n list 可以省略,因为 list get 绑定到getResult (...);

标签: java performance list


【解决方案1】:

根本不要创建列表,因为它甚至没有在您显示的代码中使用。

List<String> list = getResult(...);

【讨论】:

  • 它不会引用地图中的列表吗?当我尝试返回或迭代地图时。它可能有不同的结果。
  • 另外,请确保 ArrayList 是要创建的适当类型的列表。例如,创建LinkedList 可能会更有效。我想知道是否真的需要随机访问这个List
  • @imrantariq:我们不知道getResult() 做了什么,这让我们更难理解发生了什么。如果此代码不起作用,您需要向我们提供更多信息 - 因为它应该。当然,如果你需要将一个列表传递给getResult(),那么这会让事情有些混乱——但你需要向我们提供这些信息。请阅读tinyurl.com/so-hints
【解决方案2】:

你为什么要想要?鉴于您的地图是从一个键到一个列表...所以您想要那么多不同的列表。

特别是,您只想在每次迭代时清除列表 - 否则每个映射条目将引用 相同的列表

现在您不必创建一个 empty 列表然后忽略 - 您可以在声明中立即将 getResult() 的值分配给变量:

List<String> list = getResult(...);

这可能仍会在每次迭代时创建一个新列表(除非getResult() 返回一个现有列表),但这可能就是您想要的。

请注意,在循环外部声明list变量没有任何好处——变量声明不会影响性能,但通常最好尽可能限制变量的范围- 所以我会将声明保留在原处。

【讨论】:

    【解决方案3】:

    试试这个:

    Map<String, List> searchMap = new HashMap<String, List>();
    for(int i=0; i<something.size(); i++){
        List<String> list = getResult(...);
        ...
        searchMap.put(differentkey, list);
    }
    

    无需构建新列表。

    【讨论】:

    • 诅咒你和你的 12 秒优势!
    • @Paul 哈!击败你获得第四名。 :)
    【解决方案4】:
    Map<String, List> searchMap = new HashMap<String, List>();
    List<String> list = new ArrayList<String>();
    for(int i=0; i<something.size(); i++){
        list = getResult(...);
        ...
        searchMap.put(differentkey, list);
    }
    

    在第 4 行 (list = getResult(...);),您将一个新对象分配给您的 listvariable。因此,在此之前无需创建新列表。无论如何,您的变量都会被替换。

    【讨论】:

    • 他为什么需要构造一个新的ArrayList
    • 他为什么要扩大list变量的范围?
    • 也许他在第 4 行之后使用它。我们不知道他在“...”下的意思(第 5 行)
    【解决方案5】:
    for(int i=0; i<something.size(); i++){
     List<String> list = new ArrayList<String>();
     list = getResult(...);
    

    等价于

    for(int i=0; i<something.size(); i++){
     List<String> list = getResult(...);
    

    但我不确定你是否真的在寻找这个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 2021-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多