Liste à varargs avec la taille de pré-difined ou sans taille

Dushmantha:

Quelle est la meilleure façon de convertir la méthode Liste de varargs appeler ci-dessous « constructeur (String ... s) ».

builder( stringList.toArray( new String[stringList.size()] ) );//with pre-difined array size

ou

builder( stringList.toArray( new String[0] ) );//without predifined size

par exemple

void test() {

  List<String> stringList = new ArrayList<>();
  builder( stringList.toArray( new String[stringList.size()] ) );//call builder method with pre-difining array size
  builder( stringList.toArray( new String[0] ) );//call builder method with array size 0

}

void builder( String... s )
{

}

Je fait face à cette question dans une revue et je proposai builder( stringList.toArray( new String[0] ) )est plus efficace que d' utiliser builder( stringList.toArray( new String[stringList.size()] ) ).
Y at - il une différence significative entre ces deux? Merci

Joop Eggen:

À ma connaissance

stringList.toArray( new String[stringList.size()] ) )

est plus efficace. La raison:

L'argument est nécessaire d'avoir un type réel ( String) pour un générique List<String>, où le paramètre de type générique est effacé à moment de l' exécution.

L'argument est utilisé pour le tableau résultant si sa taille correspond à la taille de la liste.

Si la taille est 0, le tableau passé est mis au rebut.

Ainsi, le passage d'un tableau correct enregistre une création d'objet.

Bien sûr que l' list.size()on appelle supplémentaire. Il pourrait donc être plus lent. J'en doute.


Correction

Voir tableaux de la Sagesse des Anciens . Une référence correcte montre l'inverse: new String[0]être plus rapide. Je viens de l'analyse très survolé intéressante, et il semble:

  • (un court supplémentaire vécu new String[0]est hors de propos;)
  • faire le tableau de la copie méthode locale dans le toArray permet une autre, une copie plus rapide tableau;
  • (et puis il y a l'appel supplémentaire à size.)

L'esprit, je l'ai pas lu suffisamment complète l'article; il est vraiment intéressant.

Conclusion (contre-intuitive): new T[0]est plus rapide.

Faites attention à cela:

  • dames de code peuvent encore penser différemment et un avertissement;
  • c'est à l'échauffement: jusqu'à ce que les coups de pied hotspot JIT en, il peut être l'inverse.

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=197284&siteId=1
conseillé
Classement