C#与Java - 泛型列表

12

C#和Java的泛型List类的实现有何区别?


4
首先,List(http://java.sun.com/javase/7/docs/api/java/util/List.html)是Java中的一个接口,而不是类。Java中等效于C#泛型List类的是ArrayList<T>。 - Matthew Flaschen
尽管有点过时,但看起来很有趣:http://www.artima.com/intv/generics.html - Zaki
2个回答

33

嗯,在Java中,List<T>是一个接口,首先要说的就是这个。

两者之间最重要的区别是C#和Java泛型的区别:在Java中,泛型基本上执行编译时检查,并在泛型字段等中包含一些元数据 - 但实际的对象在执行时不知道它的泛型类型。换句话说,你不能询问List<?>它是什么?在实现中对泛型类型参数的任何引用都像Object一样 - 因此,ArayList<String>实际上由Object[]支持。在C#中,所有信息在执行时也都可用 - 所以List<string>string[]支持。

类似地,C#泛型允许值类型类型参数,因此您可以在C#中拥有一个List<int>,但在Java中不行。

在方差等方面还有进一步的差异-但这与List<T>相去甚远。

ArrayList<T>(Java)和List<T>(.NET)而言,有以下几点不同:

  • Java列表覆盖equals / hashCode,而.NET不会
  • ArrayList<T>通过将当前容量乘以3/2来增长; .NET的List<T>则将当前容量加倍

当然,在公开的API方面也有其他不同-如果您可以提供更多有关所感兴趣的差异类型的信息,我们可以提供更多帮助。


我记得曾经问过你为什么在 meta 总是能得到 upvotes。很棒的回答。 - Ravi Wallau
但是C#的List<T>是一个列表实现,我在想是否应该到处使用IList<__>,因为我应该总是编写接口而不是实现。我看到很多C#代码使用特定的List作为返回类型,这是错误的。如果有人决定使用不同的IList实现,那么就需要更改超过1个地方。 - Skystrider

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接