下面代码中的列表迭代列表 - 哪种方法更好?

时间:2014-04-08 05:33:38

标签: java collections arraylist

我正在迭代列表列表。在我的代码中listofuserdetailsperAccountList<List>。我正在考虑下面的两种方法,请让我知道哪种方法是正确的,更有效率,应该在java编码中遵循。

方式1 -----

for(int i=0;i<=listofuserdetailsperAccount.size();i++){
    List list=(List) listofuserdetailsperAccount.get(0);
}

方式2 ---

for(int i=0;i<=listofuserdetailsperAccount.size();i++){
        List list= new ArrayList();
             list=(List) listofuserdetailsperAccount.get(0);
    }

3 个答案:

答案 0 :(得分:3)

我会选择每个循环

for( List userDetailsPerAccount : listOfUserDetailsPerAccount ) {
    //anything you want to do with userDetailsPerAccount

}

答案 1 :(得分:0)

方式1 方式2 更好。在 Way 2 List list= new ArrayList();中,它将创建一个额外的ArrayList对象,该对象没有任何用处,这会导致内存消耗。

并且还建议使用特定类型的List<E>,这样你就不会在运行时强制转换它将是类型安全的。

for(List<E> list : listOfUserDetailsPerAccount){
   ...
}

在Java 5及以上版本中使用for-each。

答案 2 :(得分:0)

这里有两个问题,两个建议的解决方案。

  1. 您的List<List> listofuserdetailsperAccount对象输入不正确,因为内部Listraw type,需要避免。假设您的内部列表包含UserDetail个对象,则您的列表列表应为List<List<UserDetail>>类型。
  2. 您不能使用for-each loop语法迭代List Iterable

    for(List<UserDetail> innerList : listofuserdetailsperAccount)
    
  3. 在第2种方法中,您将List初始化为新的ArrayList(如果您需要,它应为new ArrayList<>()),然后立即用内容覆盖此值你的外部名单。这意味着您要求Java构造一个新对象,然后由垃圾收集器立即清理,未使用。这是浪费和不必要的。
  4. 总之,您可能希望这样做:

    List<List<UserDetail>> listofuserdetailsperAccount = // initialize your list
    
    for(List<userDetail> innerList : listofuserdetailsperAccount) {
      // do work with your innerList now
    }
    

    您评论(整理):

      

    因此,在初始化时,我现在正在做这样的事情,如果这是正确的,请告诉我:

    List<List<String>> listofAccountdetailsLoggedinUser = null;
    listofAccountdetailsLoggedinUser = new ArrayList<List<String>>(); 
    
         

    或者我不应该把它作为null并直接创建这样的对象:

    List<List<String>> listofAccountdetailsLoggedinUser = 
        new ArrayList<List<String>>();
    
    1. 这是正确的轨道,但您无需将变量初始化为null。它不会伤害任何东西,因为它不会构造一个不必要的对象,但是没有理由 - 你可以在一行中声明和初始化变量,就像你在第二个例子中那样。
    2. 此外,您不需要在右侧指定ArrayList的类型,只需使用diamond operator <>,就像这样:

      List<List<String>> listofAccountdetailsLoggedinUser = new ArrayList<>();
      
    3. 另外,考虑一个较短的变量名称,不需要使用这么长的变量名称,键入内容并不好玩。)