Ильдар Хабибуллин - Java 7 [Наиболее полное руководство]
- Название:Java 7 [Наиболее полное руководство]
- Автор:
- Жанр:
- Издательство:БХВ-Петербург
- Год:2012
- ISBN:978-5-9775-0735-6
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Ильдар Хабибуллин - Java 7 [Наиболее полное руководство] краткое содержание
Java 7 [Наиболее полное руководство] - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
Vector v = new Vector<>();
String s = "Строка, которую мы хотим разобрать на слова.";
StringTokenizer st = new StringTokenizer(s, " \t\n\r,.");
while (st.hasMoreTokens()){
// Получаем слово и заносим в вектор
v.add(st.nextToken()); // Добавляем элемент в конец вектора.
}
System.out.println(v.firstElement()); // Первый элемент. System.out.println(v.lastElement()); // Последний элемент. v.setSize(4); // Уменьшаем число элементов.
v.add("собрать."); // Добавляем в конец укороченного вектора.
v.set(3, "опять"); // Ставим элемент в позицию 3.
// Первый способ обхода коллекции типа List // использует индексы ее элементов:
for (int i = 0; i < v.size(); i++) // Перебираем весь вектор.
System.out.print(v.get(i) + " ");
System.out.println();
// Второй способ обхода коллекции использует итератор:
Iterator it = v.iterator(); // Получаем итератор вектора.
try{
while (it.hasNext()) // Пока в векторе есть элементы,
System.out.println(it.next()); // выводим текущий элемент.
}catch(Exception e){}
// Третий способ обхода коллекции использует оператор for-each: for (String s: v) // Цикл по всем элементам вектора.
System.out.println(s); // Выводим текущий элемент вектора.
Интерфейс ListIterator
Интерфейс Listiterator расширяет интерфейс iterator, обеспечивая перемещение по коллекции как в прямом, так и в обратном направлении. Он может быть реализован только в тех коллекциях, в которых есть понятия следующего и предыдущего элемента и где элементы пронумерованы.
В интерфейс Listiterator добавлены следующие методы:
□ void add (Obj ect element) — добавляет элемент element перед текущим элементом;
□ boolean hasPrevious() — возвращает true, если в коллекции есть элементы, стоящие перед текущим элементом;
□ int nextindex () — возвращает индекс текущего элемента; если текущим является последний элемент коллекции, возвращает размер коллекции;
□ Object previous () — возвращает предыдущий элемент и делает его текущим;
□ int previousindex() — возвращает индекс предыдущего элемента;
□ void set (Obj ect element) заменяет текущий элемент элементом element; выполняется
сразу после next () или previous ( ).
Как видите, итераторы могут изменять коллекцию, в которой они работают, добавляя, удаляя и заменяя элементы. Чтобы это не приводило к конфликтам, предусмотрена исключительная ситуация, возникающая при попытке использования итераторов параллельно "родным" методам коллекции. Именно поэтому в листинге 6.5 действия с итератором заключены в блок try{} catch () {}.
Изменим часть листинга 6.5 с использованием итератора Listiterator.
// Текст листинга 6.1...
// ...
ListIterator lit = v.listIterator(); // Получаем итератор вектора.
// Указатель сейчас находится перед началом вектора.
try{
while(lit.hasNext()) // Пока в векторе есть элементы,
System.out.println(lit.next()); // переходим к следующему
// элементу и выводим его.
// Теперь указатель находится за концом вектора.
// Перейдем к началу вектора. while(lit.hasPrevious())
System.out.println(lit.previous());
}catch(Exception e){}
Интересно, что повторное применение методов next () и previous () друг за другом будет выдавать один и тот же текущий элемент.
Посмотрим теперь, какие возможности предоставляют полностью определенные, готовые к работе классы-коллекции Java.
Классы, создающие списки
Класс ArrayList полностью реализует интерфейс List и итератор типа iterator. Класс ArrayList очень похож на класс Vector, у него тот же набор методов, он может использоваться в тех же ситуациях. Главное отличие класса ArrayList от класса Vector заключается в том, что класс ArrayList не синхронизован. Это означает, что одновременное изменение экземпляра этого класса несколькими подпроцессами приведет к непредсказуемым результатам. Эти вопросы мы рассмотрим в главе 22.
В классе ArrayList три конструктора:
□ ArrayList () — создает пустой объект;
□ ArrayList (Collection coll) — формирует объект, содержащий все элементы коллекции coll;
□ ArrayList (int initCapacity) — создает пустой объект емкости initCapacity.
В качестве примера использования класса ArrayList перепишем класс Chorus из листинга 3.3, используя вместо массива коллекцию.
public class Chorus{
public static void main(String[] args){
List singer = new ArrayList<>(); singer.add(new Dog()); singer.add(new Cat()); singer.add(new Cow()); for (Voice v: singer) v.voice();
}
}
Класс LinkedList полностью реализует интерфейсы List, Queue и Deque. Он реализует итераторы типа iterator и Listiterator, что превращает его в двунаправленный список. Он удобен и для организации списков, стеков, очередей и деков. Класс LinkedList не синхронизован. Кроме того, он допускает хранение ссылок null.
В классе LinkedList два конструктора:
□ LinkedList () — создает пустой объект;
□ LinkedList (Collection coll) — создает объект, содержащий все элементы коллекции
coll.
В классе LinkedList реализованы только методы интерфейсов. Других методов в нем нет.
Класс ArrayDeque полностью реализует интерфейсы Queue и Deque. В отличие от класса LinkedList он синхронизован и допускает одновременную работу нескольких подпроцессов с его объектом. Кроме того, он не допускает хранение ссылок null. Он удобен для организации стеков, очередей и деков, тем более что он работает быстрее, чем классы Stack и LinkedList.
В классе ArrayDeque три конструктора:
□ ArrayDeque ( ) -создает пустой объект;
□ ArrayDeque (Collection coll) — создает объект, содержащий все элементы коллекции
coll;
□ ArrayDeque (int numElement) — создает пустой объект емкости numElement.
1. Перепишите листинг 6.1 с использованием классов списков.
Классы, создающие отображения
Класс HashMap полностью реализует интерфейс Map, а также итератор типа iterator. Класс HashMap очень похож на класс Hashtable и может использоваться в тех же ситуациях. Он имеет тот же набор функций и такие же конструкторы:
□ HashMap () — создает пустой объект с показателем загруженности 0,75;
□ HashMap (int capacity) - формирует пустой объект с начальной емкостью capacity и
показателем загруженности 0,75;
□ HashMap (int capacity, float loadFactor) — создает пустой объект с начальной емкостью capacity и показателем загруженности loadFactor;
□ HashMap(Map f) — создает объект класса HashMap, содержащий все элементы отображения f, с емкостью, равной удвоенному числу элементов отображения f, но не менее 11, и показателем загруженности 0,75.
Класс WeakHashMap отличается от класса HashMap только тем, что в его объектах неиспользуемые элементы, на которые никто не ссылается, автоматически исключаются из объекта.
Читать дальшеИнтервал:
Закладка: