2010-03-21 10 views
9

Quelles sont les différences entre les implémentations C# et Java de la classe générique List?C# vs Java - Listes génériques

+3

Bien, pour un, Liste (http://java.sun.com/javase/7/docs/api/java/util/List.html) est une interface en Java, pas une classe. L'équivalent Java de la classe générique C# List est ArrayList

+0

bien qu'un peu daté, semble intéressant: http://www.artima.com/intv/generics.html – Zaki

Répondre

4

Demandez-vous des différences dans leur API ou leur implémentation sous-jacente? Je crois que les génériques Java sont implémentés complètement via le compilateur - la JVM n'a aucune notion de générique. Pour C#, les génériques sont un concept intégré de l'exécution .Net. Wikipedia semble avoir une bonne comparaison des deux: http://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Java#Generics

30

Eh bien, en Java List<T> est une interface, pour commencer :)

La différence la plus importante entre les deux est la différence entre C# et Java génériques à Commençons par: en Java, les génériques effectuent essentiellement des vérifications à la compilation et incluent des métadonnées dans des champs génériques, etc. - mais l'objet ne connaît pas son type générique au moment de l'exécution. Vous ne pouvez pas demander à un List<?> quoi cela? est, en d'autres termes. Toutes les références à un paramètre de type générique dans la mise en œuvre agissent comme Object, fondamentalement - ainsi un ArayList<String> est réellement soutenu par un Object[]. En C#, toutes les informations sont également disponibles au moment de l'exécution. Par conséquent, un List<string> est soutenu par un string[]. De même, les génériques C# permettent des arguments de type valeur, donc vous pouvez avoir un List<int> en C# mais pas en Java.

Il existe d'autres différences en termes de variance, etc., mais cela se déplace beaucoup depuis List<T>.

En termes de justeArrayList<T> (Java) et List<T> (.NET), quelques différences:

  • Java liste surchargent equals/hashCode, alors qu'ils ne le font pas dans .NET
  • ArrayList<T> se développe en multipliant la capacité actuelle par 3/2; List<T> de .NET permet de doubler la capacité actuelle à la place

Bien sûr, il existe d'autres différences en termes des API exposées - si vous pouviez donner plus d'informations sur le genre de différence que vous êtes intéressé, nous pourrions aider plus.

+0

Et je me souviens d'avoir demandé pourquoi vous auriez toujours upvotes @ meta. Très bonne réponse. –

+0

Mais la liste C# est une implémentation de liste, je me demande si je devrais utiliser IList <__> partout parce que je devrais toujours programmer sur une interface, pas une implémentation. Je vois beaucoup de code C# utiliser spécifique List comme types de retour qui est faux. Si quelqu'un décide d'utiliser une implémentation diff de IList, alors plus d'une place doit changer. – Skychan