构造
List<Integer> booksList = new LinkedList<>();
经常看到主要有两个原因:
- a) 你不确定最适合你的收藏是什么。有很多候选对象:数组、集合、列表、向量、映射等,但您必须使用特定的东西。所以在右手边,它必须是具体的,但在左手边,你要尽可能地敞开心扉。
很多时候你只是对集合进行迭代,使用 for 循环,搜索,排序,放入,取自,删除。
如果您发现第一个想法的兄弟更适合,您可以稍后更改 RHS,而无需重写程序的其余部分,因为例如,LinkedList 和 ArrayList 的大多数方法都满足相同的合同,定义在列表中。
- b)如果您使用更广泛的对象,您将与外部世界兼容。当然,你不能使用像 Object 这样模糊的东西,因为 Object 没有 .add (E) 方法。
但是对于排序、搜索等 List 非常适合。查看文档,并比较 List、LinkedList 和 ArrayList。尝试在您的代码中将其替换为另一个。
也许 Linked~ 和 ArrayList 中的两个 'sublist (int fromIndex, int toIndex)' 方法在基类中定义,并且行为相同。
但也许他们是专门的,并且自己实现 subList 。这里我们有一个接口 <- 类的关系,所以我们知道,接口中没有实现,它是完全抽象的。但是在(抽象)基类<-派生类的情况下,模式是相同的。派生/实现类共享相同的接口,“public List sublist (int fromIndex, int toIndex)”。您希望它们产生相同的结果,但以不同的方式 - 也许。
仅当您需要调用仅存在于 LinkedList 中的方法时,您才可以预先将 bookList声明为 LinkedList,或者为此目的进行转换:
List<Integer> books = new LinkedList<>();
// ...
LinkedList <Integer> booksLiLi = (LinkedList <Integer>) books <> ();
// do something with booksLiLi which isn't defined on the List interface.
旁注:您的代码可以使用现代(7 岁)foreach 循环进行简化:
Scanner input = new Scanner (System.in);
LinkedList<Integer> booksList = new LinkedList<>();
System.out.printf ("Give: ");
String N = input.nextLine ();
String[] arr = answer.split (" ");
for (String num: arr) {
booksList.add (Integer.parseInt (num));
}
bookList.remove ();
bookList.remove ();
但是如果你声明了一个 Scanner,你可以直接从 Scanner 中获取 Integers:
Scanner input = new Scanner (System.in);
LinkedList<Integer> booksList = new LinkedList<>();
System.out.printf ("Give: ");
while (input.hasNextInt ()) {
booksList.add (input.nextInt ());
}
bookList.remove ();
bookList.remove ();
作为对评论的回应,这里是第三个代码:从 System.in 中读取一行,然后在该行上创建一个 Scanner:
String line = input.nextLine ();
Scanner valueLine = new Scanner (line);
List<Integer> books = new LinkedList<>();
while (valueLine.hasNextInt ()) {
books.add (valueLine.nextInt ());
}