コンストラクト
List<Integer> booksList = new LinkedList<>();
主に2つの理由でよく見られます:
- a)目的に最適なコレクションが何かわからない。配列、セット、リスト、ベクター、マップなど、多くの候補がありますが、特定のものを使用する必要があります。したがって、右側ではコンクリートである必要がありますが、左側では、できるだけ大きく開くようにします。
多くの場合、コレクションを繰り返し処理し、forループを使用し、検索、並べ替え、挿入、取得、削除を行います。
最初に考えた兄弟の方が適していることがわかった場合は、プログラムの残りの部分を書き直すことなく、後でRHSを変更できます。たとえば、LinkedListとArrayListのほとんどのメソッドは、定義された同じコントラクトを満たします。リスト内。
- b)より広いオブジェクトを使用すると、外界との互換性が得られます。もちろん、Objectには.add(E)メソッドがないため、Objectほど曖昧なものを使用することはできません。
ただし、並べ替えや検索などには、リストが適しています。ドキュメントを見て、List、LinkedList、ArrayListを比較してください。コード内で1つを別のものに置き換えてみてください。
Linked〜とArrayListの2つの'sublist(int fromIndex、int toIndex)'メソッドが基本クラスで定義されており、同じように動作する可能性があります。
しかし、おそらくそれらは専門化されており、独自にsubListを実装しています。ここでは、インターフェイス<-クラスの関係があるため、インターフェイスには実装がなく、完全に抽象的であることがわかります。しかし、(抽象)基本クラス<-派生クラスの場合、パターンは同じです。派生/実装クラスは同じインターフェース'publicList 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-loopを使用して簡略化できます。
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 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 ();
コメントへの反応として、3番目のコードがあります:System.in行から読み取り、その行にスキャナーを作成します。
String line = input.nextLine ();
Scanner valueLine = new Scanner (line);
List<Integer> books = new LinkedList<>();
while (valueLine.hasNextInt ()) {
books.add (valueLine.nextInt ());
}