2016-05-09 1 views
2

Je reçois arraylist.get(i) chaque fois qu'une boucle s'exécute plus de trois fois dans la boucle.Lequel est préférable?

Est-il conseillé ou dois-je le stocker dans une variable séparée, puis l'utiliser encore et encore? Lequel est préférable performance sage?

+2

i est une variable de condition, juste un nombre. –

+0

'Get' une fois et ensuite l'utiliser tout au long. – robotlos

+0

Je dirais que vous ne perdez pas beaucoup, et l'amélioration de la performance est négligeable. En regardant la source [ArrayList] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/ArrayList.java#ArrayList.elementData%28int% 29), tout ce qu'il fait est une vérification de gamme pour voir si 'i' est dans les limites de la taille, et retourne l'élément d'un tableau. –

Répondre

4

La définition d'une variable est légèrement plus efficace. Activer arrayList.get (I) est O (1) mais coûte quand même quelque chose bien qu'il soit vraiment mineur et insignifiant. Le réglage d'une variable est plus lisible à mon avis.

2

la déclaration et l'affectation d'une variable une fois comme String myString = arraylist.get(i); seront légèrement plus rapides que d'appeler arraylist.get(i) plusieurs fois.

Une fois cela fait, vous pouvez appeler n'importe quelle méthode sur l'instance myString. Je suppose que arraylist est de type ArrayList<String>.

vous pouvez inclure un chèque nul dans votre boucle ainsi:

for(int i = 0; i < arraylist.size(); i++){ 
    String myString = arraylist.get(i); 
    if(myString != null){ 
     //any calls to methods on myString 
    } 
} 
4

Il est toujours une bonne approche pour écrire un code lisible et maintenable. Puisque votre question est très large, attendez-vous à des réponses générales.

 List<Integer> integerList = new ArrayList<>(); 
     for (int i=0;i<integerList.size();i++) { 
      Integer integerValue = integerList.get(i); 
      // make sure integerValue is not null. 
      // Thanks @Tom for pointing this out 

      System.out.println (integerValue); 

      // Do operations 

      System.out.println (integerValue); 

      // Do more operations 

      System.out.println (integerValue); 
     } 

Maintenant, il s'agit d'une affectation unique, mais vous pouvez l'utiliser plusieurs fois. Maintenant, par exemple, vous devez changer la logique du programme pour que vous voulez toujours obtenir i+1, il vous sera facile de changer une seule fois, pas plusieurs fois.

+1

Juste une note: 'int integerValue = integerList.get (i);' est vulnérable à un 'NullPointerException'. – Tom

+0

@Tom Merci beaucoup, mis à jour. –

+0

@Tom Comment pourrait-il être vulnérable à la NPE? L'état de la boucle ne serait-il pas respecté, l'empêchant d'entrer? –

3

Comme mentionné précédemment, obtenir l'objet une fois est légèrement plus efficace. Naturellement la plupart du temps cela ne produira aucun problème et vous ne remarquerez aucune différence.
Logiquement, car il s'agit d'une opération O(1), il ne devrait pas provoquer de différences du tout, mais parce qu'il appelle une fonction d'un objet de type ArrayList, il est moins compatible avec le cache et une référence mémoire directe peut être nécessaire. Encore la différence est très petite.