Философия Java

         

Функциональность List


Основной List достаточно прост для использования, по сравнению с ArrayList. Хотя большую часть времени вы будите просто использовать add( ) для вставление объектов, get( ) для получения их обратно в любое время и iterator( ) для получения Iterator последовательности, есть также набор других методов, которые также полезны.

Кроме того, на самом деле есть два типа List: основной ArrayList, выделяется доступом к элементам в случайном порядке, и более мощный LinkedList (который не предназначен для быстрого доступа в случайном порядке, но имеет более общий набор методов).

List (интерфейс) Порядок - наиболее важная особенность для List; он обещает, что элементы будут храниться в определенной последовательности. List добавляет несколько методов к набору Collection, которые позволяют вставку и удаление элементов в середине списка List. (Это рекомендуется только для LinkedList.) List производит ListIterator, и, используя его, вы можете пройти весь List в обоих направлениях, а также вставлять и извлекать элементы из середины списка List.

ArrayList* List реализуется массивом. Позволяет быстрый доступ в случайном порядке к элементами, но медленный, когда вставляются и удаляются элементы из середины списка. ListIterator должен использоваться только для прямого и обратного движения по ArrayList, но не для вставления и удаления элементов, что является очень дорогим, по сравнению с LinkedList.
LinkedList Обеспечивает оптимальный доступ к последовательности, который недорогой при вставках и удаленьях из середины списка List. Относительно медленный при случайном выборе элементов. (Используйте для этого ArrayList.) Также имеются методы addFirst( ), addLast( ), getFirst( ), getLast( ), removeFirst( ) и removeLast( ) (которые не определены во всех интерфейсах или базовых классах), позволяющие использовать связанный список как стек, очередь и двойную очередь.

Методы из следующего примера охватывают различную группу действий: то, что могут сделать все списки (basicTest( )), перемещение с помощью Iterator (iterMotion( )) против изменения с помощью Iterator (iterManipulation( )), просмотр результатов манипуляции с List (testVisual( )), и операции, поддерживаемые только для LinkedList.

//: c09:List1.java




// То, что вы можете сделать со списками.

import java.util.*; import com.bruceeckel.util.*;

public class List1 { public static List fill(List a) { Collections2.countries.reset(); Collections2.fill(a, Collections2.countries, 10); return a; } static boolean b; static Object o; static int i; static Iterator it; static ListIterator lit; public static void basicTest(List a) { a.add(1, "x"); // Вставка в позицию 1

a.add("x"); // Вставка в конец

// Добавление Сollection:

a.addAll(fill(new ArrayList())); // Добавление Collection, начиная с 3 позиции:

a.addAll(3, fill(new ArrayList())); b = a.contains("1"); // Есть здесь?

// Есть ли вся Collection здесь?

b = a.containsAll(fill(new ArrayList())); // Списки позволяют случайный доступ, который дешев

// для ArrayList, и дорог для LinkedList:

o = a.get(1); // Получить объект из позиции 1

i = a.indexOf("1"); // Узнать индекс объекта

b = a.isEmpty(); // Есть ли элементы внутри?

it = a.iterator(); // Обычный Iterator

lit = a.listIterator(); // ListIterator

lit = a.listIterator(3); // Начать с позиции 3

i = a.lastIndexOf("1"); // Последнее совпадение

a.remove(1); // Удалить из позиции 1

a.remove("3"); // Удалить этот объект

a.set(1, "y"); // Установить позицию 1 на "y"

// Оставить все, что есть в аргументе

// (пересечение двух множеств):

a.retainAll(fill(new ArrayList())); // Удаление всего, что есть в аргументе:

a.removeAll(fill(new ArrayList())); i = a.size(); // Каков размер?

a.clear(); // Удаление всех элементов

} public static void iterMotion(List a) { ListIterator it = a.listIterator(); b = it.hasNext(); b = it.hasPrevious(); o = it.next(); i = it.nextIndex(); o = it.previous(); i = it.previousIndex(); } public static void iterManipulation(List a) { ListIterator it = a.listIterator(); it.add("47"); // Должно произойти перемещение на элемент после добавления:

it.next(); // Удалить элемент, который был только что выбран:



it.remove(); // Должно переместится на элемент, после remove():

it.next(); // Изменить элемент, который только что выбран:

it.set("47"); } public static void testVisual(List a) { System.out.println(a); List b = new ArrayList(); fill(b); System.out.print("b = "); System.out.println(b); a.addAll(b); a.addAll(fill(new ArrayList())); System.out.println(a); // Вставка, удаление и замена элементов с // использованием ListIterator:

ListIterator x = a.listIterator(a.size()/2); x.add("one"); System.out.println(a); System.out.println(x.next()); x.remove(); System.out.println(x.next()); x.set("47"); System.out.println(a); // Проход списка в обратном порядке:

x = a.listIterator(a.size()); while(x.hasPrevious()) System.out.print(x.previous() + " "); System.out.println(); System.out.println("testVisual finished"); } // Есть некоторые вещи, которые

// может делать только LinkedList:

public static void testLinkedList() { LinkedList ll = new LinkedList(); fill(ll); System.out.println(ll); // Трактуем его, как стек, вталкиваем:

ll.addFirst("one"); ll.addFirst("two"); System.out.println(ll); // Аналогично "заглядыванию" в вершину стека:

System.out.println(ll.getFirst()); // Аналогично выталкиванию из стека:

System.out.println(ll.removeFirst()); System.out.println(ll.removeFirst()); // Трактуем, как очередь, вталкиваем элементы

// и вытаскиваем с конца:

System.out.println(ll.removeLast()); // С обеими приведенными выше операциями - это двойная очередь!

System.out.println(ll); } public static void main(String[] args) { // Создаем и заполняем каждый раз новый список:

basicTest(fill(new LinkedList())); basicTest(fill(new ArrayList())); iterMotion(fill(new LinkedList())); iterMotion(fill(new ArrayList())); iterManipulation(fill(new LinkedList())); iterManipulation(fill(new ArrayList())); testVisual(fill(new LinkedList())); testLinkedList(); } } ///:~

В basicTest( ) и iterMotion( ) вызовы сделаны для показа правильного синтаксиса, а полученное возвращаемое значение нигде не используется. В некоторых случаях возвращаемое значение никуда не присваивается, так как оно обычно не используется. Вы должны посмотреть полное использование этих методов в онлайн документации на java.sun.com , прежде чем начнете использовать их.


Содержание раздела