2010-03-21 17 views
9

¿Cuáles son las diferencias de las implementaciones C# y Java de la clase List genérica?C# vs Java - Listas genéricas

+3

Bueno, para empezar, List (http://java.sun.com/javase/7/docs/api/java/util/List.html) es una interfaz en Java, no una clase. El equivalente de Java a la clase de lista genérica de C# es ArrayList

+0

, aunque un poco anticuado, parece interesante: http://www.artima.com/intv/generics.html – Zaki

Respuesta

4

¿Está pidiendo diferencias en su API o en su implementación subyacente? Creo que los genéricos de Java se implementan completamente a través del compilador: la JVM no tiene noción de genéricos. Para C#, los genéricos son un concepto integrado del tiempo de ejecución .Net. Wikipedia parece tener una buena comparación de los dos: http://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Java#Generics

30

Bueno, en Java List<T> es una interfaz, para empezar :)

La diferencia más importante entre los dos es la diferencia entre C# y Java genéricos a comenzar con: en los genéricos de Java básicamente se realizan verificaciones en tiempo de compilación e incluyen algunos metadatos en campos genéricos, etc., pero el objeto real no conoce su tipo genérico en el momento de la ejecución. No puedes preguntarle a List<?> que es eso? es, en otras palabras. Cualquier referencia a un parámetro de tipo genérico en la implementación actúa como Object, básicamente, por lo que un ArayList<String> está realmente respaldado por un Object[]. En C#, toda la información está disponible también en tiempo de ejecución, por lo que List<string> está respaldado por string[].

De forma similar, los genéricos de C# permiten argumentos de tipo de tipo de valor, por lo que puede tener un List<int> en C# pero no en Java.

Existen otras diferencias en términos de varianza, etc., pero esto se está moviendo muy lejos de List<T>.

En términos de simplementeArrayList<T> (Java) y List<T> (NET), un par de diferencias:

  • Java enumera anulación es igual a/hashCode, mientras que no lo hacen en .NET
  • ArrayList<T> crece multiplicando la capacidad actual por 3/2; de .NET List<T> duplica la capacidad actual en lugar

Por supuesto, hay otras diferencias en términos de las API expuestas - si se puede dar más información sobre el tipo de diferencia que le interesa, podríamos ayudar a más.

+0

Y recuerdo haber preguntado por qué siempre recibiría votaciones @ meta. Gran respuesta. –

+0

Pero C# List es una implementación de listas, me pregunto si debería usar IList <__> en todas partes porque siempre debería programar a una interfaz, no a una implementación. Estoy viendo un montón de código C# usar una lista específica como tipos de devolución que es incorrecta. Si alguien decide usar una implementación diff de IList, entonces más de 1 lugar tiene que cambiar. – Skychan

Cuestiones relacionadas