【问题标题】:Java Generics List and ArrayList with and without Parameters带和不带参数的 Java 泛型列表和 ArrayList
【发布时间】:2015-09-25 13:32:29
【问题描述】:

我正在阅读有关 Java 泛型的信息。我想问一下下面的语句有什么区别。

1:List<String> list = new ArrayList(3);

2:List<String> list = new ArrayList<String>(2);

3:List<String> list = new ArrayList<String>();

4a: List<String> list = new ArrayList("A"); // 为什么我不能使用字符串?

4b: List<String> list = new ArrayList('a'); // 但 char 工作正常。

我正在阅读Java Docs on Generics,之后我需要问上述问题,因为我没有得到确切的答案。(可能是因为英语不好)

【问题讨论】:

  • char 工作不正常,它被视为int。一个好的起点是阅读javadoc for ArrayList
  • @SeanBright ArrayList 可以只取 int 作为参数吗?如果是,那么该参数的作用是什么?
  • 我链接到的文档解释了这一点
  • @LetDoit Sean 的链接是官方的 Java 文档(称为 JavaDocs)——无论它在这里说什么都是该语言的工作原理。它详细介绍了方法重载、参数、类层次结构等...另一方面,您的链接是(官方)教程的一部分,该教程通常对初学者来说足够好,但没有像文档一样详细。
  • @LetDoit 如果您想学习一般的编程,JavaDocs 读起来有点枯燥。我认为,如果您现在坚持使用教程并在遇到类似这样的更具体问题时转到 JavaDoc,那是可以的。

标签: java generics arraylist


【解决方案1】:

这与泛型无关。 ArrayList 有一个构造函数,它接受一个 int,它表示 List 的初始容量。 char ('a') 可转换为 int,这就是为什么 4b 的工作方式与 1 和 2 一样。没有构造函数接受 String,因此 4a 无法通过编译。

编辑:

使用原始类型(即没有类型参数,如List<String> list = new ArrayList(3))实例化一个类是您不应该做的事情,因为它的类型安全性较低,并且只允许向后兼容。

【讨论】:

  • 嗯,这就是解释 4a...1 和 2 之间的区别确实与泛型有关...
  • @Eran 当我在选项 2 或 3 中使用 String 作为类型参数时。new ArrayList<String>(); 那么为什么编译器会通知我使用 Diamond 运算符? <> ?
  • @LetDoit 菱形运算符是一种快捷方式,可让您键入更少的代码。你可以写成等价的List<String> list = new ArrayList<>(2);,而不是写List<String> list = new ArrayList<String>(2);
  • @Eran 好的,正如您在第一行中所说的那样,which represents the initial capacity of the List. 当我使用 List<String> list = new ArrayList<String>(1); 并使用 list.add("a"); 超过 2 次时,为什么它没有显示索引超出范围或额外添加错误?
  • @Let Do it No,它可以提高性能。如果您事先知道您的列表将包含至少 100000 个元素,则可以使用 100000 作为初始容量,并在向列表中添加元素时节省容量自动增长所需的时间。
【解决方案2】:

您使用的ArrayList constructor 与泛型类型无关。它只需要一个int 来表示它的初始容量。

当您调用new ArrayList('a') 时,您只是将'a' 提升为int (65)。

【讨论】:

  • 为什么每个人都重复第四个选项的答案?
  • 与 Sean 的链接相同,您还给了我 javase7 链接,为什么不 8?
猜你喜欢
  • 2017-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 1970-01-01
  • 1970-01-01
  • 2016-03-31
  • 1970-01-01
相关资源
最近更新 更多