Конструкт
List<Integer> booksList = new LinkedList<>();
часто рассматривается в основном 2 причины:
- а) Вы не уверены, что лучшая коллекция для вашей цели есть. Есть много кандидатов: массивы, наборы, списки, вектор, карта и т. Д., Но вы должны использовать что-то конкретное. Итак, с правой стороны это должно быть конкретным, но с левой стороны вы стараетесь быть как можно более широким.
Очень часто вы просто выполняете итерацию по коллекции, используете цикл for, выполняете поиск, сортируете, вставляете, извлекаете, удаляете.
Если вы узнали, что родной брат вашей первой мысли лучше подходит, вы можете позже изменить RHS, не переписывая остальную часть своей программы, потому что, например, большинство методов LinkedList и ArrayList заполняют тот же контракт, определенный в Списке.
- b) Вы получаете совместимость с внешним миром, если используете более широкий объект. Конечно, вы не можете использовать что-то неопределенное, как Object, поскольку Object не имеет метода .add (E).
Но для сортировки, поиска и т. Д. Список хорошо подходит. Посмотрите документацию и сравните List, LinkedList и ArrayList. Попробуйте заменить один на другой в коде.
Возможно, в базовом классе определены два метода 'sublist (int fromIndex, int toIndex)' в Linked ~ и ArrayList и ведут себя одинаково.
Но, возможно, они специализированы и реализуют сублист самостоятельно. Здесь у нас есть интерфейс < - отношение класса, поэтому мы знаем, что в интерфейсе нет реализации, оно полностью абстрактно. Но в случае (абстрактных) базовых классов < - производные классы одинаковы. . Производные/реализующие классы используют один и тот же интерфейс, '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.
Sidenote: Ваш код может быть упрощен с современным (7 лет) Еогеасп петлей:
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();
Но если вы объявляете сканер, вы можете взять Inte юрт от сканера непосредственно:
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 линии, а затем создать сканер на том, что линии:
String line = input.nextLine();
Scanner valueLine = new Scanner (line);
List<Integer> books = new LinkedList<>();
while (valueLine.hasNextInt()) {
books.add (valueLine.nextInt());
}
Не объявлять переменные заранее, прежде чем использовать их. Держите их область малой. N используется 4 строки позже и может быть введена прямо там ('N = ...'), счетчик не используется вне цикла. –
Я просто подумал, что это как хорошее правило объявить их заранее, что это будет лучше для глаз? Что касается подсчета, я снова использую его в основной программе –
, я имею в виду, что я объявляю их заранее и пишу комментарий рядом с ними, чтобы я знал, где они используются. –