Главная страница

Java. Полное руководство. 8-е издание. С. Н. Тригуб Перевод с английского и редакция


Скачать 25.04 Mb.
НазваниеС. Н. Тригуб Перевод с английского и редакция
АнкорJava. Полное руководство. 8-е издание.pdf
Дата28.02.2017
Размер25.04 Mb.
Формат файлаpdf
Имя файлаJava. Полное руководство. 8-е издание.pdf
ТипДокументы
#3236
страница45 из 90
1   ...   41   42   43   44   45   46   47   48   ...   90
class VectorDemo {
public static void main(String a r g s []) {
// Начальный размер 3, инкремент 2
Vector v = new Vector(3, Начальный размер " + v.siz e O ) Начальная емкость " + v .capacity());
v.addElement(1);
v .addElement(2);
v.addElement(3);
v .addElement(4);
System.out.p r Емкость после четырех добавлений " +
v Текущая емкость " + v .capacity());
v .addElement(6);
v .addElement(7) Текущая емкость " + v .capacity());
v .addElement(9); Текущая емкость " + v .capacity());
v.addElement(11); Первый элемент " + Последний элемент " + v.lastElement());

5 3 Часть II. Библиотека Вектор содержит 3.");
// Перебор элементов вектора vEnum = v .elements();
System.out.println("\пЭлементы вектора) + " "Вывод этой программы приведен ниже.
Начальный размер Начальная емкость Емкость после четырех добавлений Текущая емкость Текущая емкость Текущая емкость Первый элемент Последний элемент Вектор содержит Элементы вектора 2 3 4 5 б 7 9 10 11 Вместо того чтобы полагаться на перебор объектов в цикле (как это делает приведенная выше программа, вы можете использовать итератор. Например, в программу можно поместить следующий итеративный код Использовать итератор для отображения содержимого
Iterator vltr = v.iterator();
System.out.println("ХпЭлементы вектора e x t () + " "Вы можете перебрать вектор циклом “for-each”, как показано в следующей версии предыдущего кода Использовать расширение цикла for для отображения элементов
System.o u t .printIn("ХпЭлементы вектора
for(int i :
v)
System.out.print(i + " ");
System.out.println() Поскольку интерфейс
E n u m e r a t io n не рекомендуется применять в новом коде, обычно выбудете использовать итераторы и циклы “for-each” для перебора всех элементов вектора. Конечно, существует большой объем кода, использующего интерфейс
E n u m e r a tio n . К счастью, перечисления и итераторы работают почти одинаково.
Класс
S t a c Класс
S t a c k
— это подкласс класса
V e c t o r , который реализует стандартный стек последний вошел — первый вышел. Класс
S t a c k определяет только стандартный конструктор, создающий пустой стек. С появлением версии JDK 5 класс
Глава 17. Пакет java.util: инфраструктура Collections Fram ew ork
5 3 1
Stack был перепроектирован под обобщенный синтаксис, и теперь он объявлен следующим образом Здесь Е указывает тип элементов, сохраняемых в стеке. Класс
Stack включает все методы, определенные в классе
Vector, и добавляет некоторые свои, которые перечислены в табл. Таблица 17.20. Методы, определенные в классе s t a c k

b n m m m
:
!
-
,
;
:

*
b o o lean em Возвращает значение tr u e , если стек пустой, и значение f a l s e если он содержит элементы

p e e Возвращает элемент с вершины стека, ноне удаляет его
p o Возвращает элемент с вершины стека, удаляя его p u s h
(
E эл емент)
Вталкивает элемент в стек. Значение параметра элемент также возвращается i n t s e a rc h (O b je c Ищет элемент в стеке. Если элемент найден, возвращает сме­
эл емент)
щение от вершины стека до этого элемента. В противном случае возвращает значение Чтобы поместить объект в верхушку стека, вызовите метод push ()
. Чтобы удалить и вернуть верхний элемент, вызовите метод pop
(). Вы можете использовать метод реек) для возврата верхнего объекта без его удаления. Исключение
EmptyStackExcept ion передается, если применить метод pop
() или реек) к пустому стеку. Метод empty
() возвращает значение true, если стек пуст. Метод search
() определяет, содержится ли объект в стеке, и возвращает количество вызовов метода pop ()
, необходимых для перемещения его в вершину стека. Ниже приведен пример, который создает стек, вставляет в него несколько объектов класса
Integer, а затем извлекает их обратно Демонстрация применения класса Stack,
import java.util.*;
class StackDemo {
static void showpush(Stack st, int a) {
st.push(a);
System, out .println ("push (1
1
+ a + стек стек " + st);
}
public static void main(String a r g s []) {
Stack st = new стек " + st) ;
showpush(st, 42);
showpush(st, 66);
showpush(st, 99);
showpop(s t );
showpop(st);

5 3 Часть II. Библиотека Java
showpop(st) ;
try {
sh o w po p(st);
} catch (EmptyStackException e) {
S y s t e m .o u t .p r in t стек пуст");
}
}
}
Ниже представлен вывод программы обратите внимание на вызов обработчика исключения
E m p ty S t a c k E x c e p ti o n , позволяющего успешно обработать ситуацию с пустым стеком.
стек: []
p u s h
(42
) стек [42]
p u s h (66) стек [42, 66]
p u s h стек стек [42, 66]
pop -> 66 стек [42]
pop
-> 42 стек []
pop
-> стек пуст
Отметим еще один момент хотя класс
S t a c k в версии Java SE б устаревшим не считается, лучшим выбором будет класс
A rra y D e q u e Класс
D i c t i o n a r Класс
D i c t i o n a r y
— это абстрактный ю тсс, представляющий хранилище для пар “ключ-значение” и работающий, в основном, подобно карте. Передав ключи значение, вы можете сохранить значение в объекте класса
D i c t i o n a r y . Однажды сохраненное значение можно извлечь по его ключу. То есть, подобно карте, объект класса
D i c t i o n a r y словарь) можно считать списком пар ключ- значение. Хотя класс
D i c t i o n a r y и не объявлен нежелательным, его можно рассматривать как устаревший, поскольку его полностью заменяет карта. Однако класс
D i c t i o n a r y все еще применяется, поэтому мы опишем его здесь.
С появлением комплекта JD K 5 класс
D i c t i o n a r y был также сделан обобщенным. Он объявлен следующим образом, class Здесь К указывает тип ключей, а У
— тип значений. Абстрактные методы, определенные в классе
D i c t i o n a r y , перечислены в табл. Таблица 17.21. Методы, определенные в классе

D i c t i o n a r Метод
' Описание
-■ 'С
\
> ---
1-1».
»
Enumeration Возвращает перечисление значений, хранимых в словаре elem ents ()
V get (O b jec t
ключ)
Возвращает объект, содержащий значение, ассоциированное с ключ Если ключ не содержится в словаре, возвращается значение n u ll
Глава 17. Пакет java.util: инфраструктура Collections Fram ew ork
5 3 Окончание табл. 17.21

Метой
Описание
boolean i s E m p t y O
Enumeration k e y s ()
V p u t (К ключ,
V значение remove(Object ключ Возвращает значение
true, если словарь пусти значение f a l s e , если он содержит хотя бы одно значение Возвращает перечисление ключей, хранимых в словаре
Вставляет ключи значение в словарь. Возвращает значение
null, если ключ еще не содержится в словаре, в противном случае возвращает предыдущее значение, ассоциированное с
ключ
Удаляет ключи его значение из словаря. Возвращает значение, ассоциированное с ключ Если ключ не содержится в словаре, возвращает значение Возвращает количество элементов в словаре_____________
Чтобы добавить ключи его значение в словарь, используйте метод put (). Вызывайте метод get
() для извлечения значения по заданному ключу. Ключи и значения могут быть возвращены как перечисление методами keys
() и elements
() соответственно. Метод size
() возвращает количество пар “ключ-значение”, сохраненных в словаре, а метод isEmpty
() — значение true, если словарь пуст. Для удаления любой пары “ключ-значение” можно применять метод remove (Помните Класс

Dictionary устарел. Для получения функциональных возможностей хранения пар “ключ-значение" следует реализовать интерфейс

мар.
Класс
H a s h t a b l Класс
Hashtable
— это часть исходного пакета j ava .util и конкретная реализация класса
Dictionary. Однако с появлением коллекций класс
Hashtable был перепроектирован так, чтобы реализовать также интерфейс
Мар. То есть класс
Hashtable интегрирован в инфраструктуру коллекций. Он подобен классу
HashMap, но синхронизирован.
Подобно классу
HashMap, класс
Hashtable сохраняет пары “ключ-значение” в хеш-таблице. Однако ни ключи, ни значения не могут быть пусты. При использовании класса
Hashtable вы указываете объект, который служит ключом, и значение, которое хотите связать с этим ключом. Ключ затем хешируется, а результирующий хеш-код используется в качестве индекса, по которому значение сохраняется в таблице.
Класс
Hashtable был сделан обобщенным в JDK 5. Он объявлен следующим образом HashtablecK, Здесь Куказывает тип ключей, а У — тип значений.
Хеш-таблица может только сохранять объекты, которые переопределяют методы hashCode
() и equals
(), определенные в классе
Obj ect. Метод hashCode
() должен вычислять и возвращать хеш-код объекта. Конечно, метод equals
() должен сравнивать два объекта. К счастью, многие из встроенных классов Java уже реализуют метод hashCode ()
. Так, например, наиболее общий класс
Hashtable использует в качестве ключа объект
String. Класс
String реализует и метод hashCode
( ), и метод equals Конструкторы класса
Hashtable показаны ниже размер

5 3 Часть II. Библиотека Java
Hashtable(int размер float
коэффЗаполнения)
Hashtable(Map Первая версия — стандартный конструктор. Вторая версия создает хеш-таблицу, имеющую начальный размер, указанный параметром размер (Размер по умолчанию — 11.) Третья версия создает хеш-таблицу с начальным размером размер и коэффициентом заполнения, заданным параметром коэфф Заполнения Этот коэффициент лежит в пределах от 0,0 дои определяет, насколько полной должна быть таблица, прежде чем она будет расширена. Точнее, когда число элементов превышает емкость, умноженную на коэффициент заполнения, хеш-таблица расширяется. Если вы не указываете коэффициент заполнения, используется значение по умолчанию 0,75. И наконец, четвертая версия создает хеш-таблицу, инициализированную элементами из коллекции т По умолчанию используется коэффициент заполнения, равный В дополнение к методам, определенным в интерфейсе
Мар, который теперь реализует класс
H a s h t a b l e , последний определяет также унаследованные методы, перечисленные в табл. 17.22. При попытке использования пустого ключа некоторые методы передают исключение
N u l l P o i n t e r E x c e p t i o n Таблица 17.22. Унаследованные методы, определенные в классе

H a s h t a b l e
Метод
Описание
void c l e a r ()
Object c l o n e ()
boolean contains(Object значение ключ)
boolean
containsValue(Object значение ключ i s E m p t y O

Enumeration k e y s ()
V put(K ключ V значение
ключ)
Сбрасывает и очищает хеш-таблицу
Возвращает дубликат вызывающего объекта
Возвращает значение
true, если некоторое значение, эквивалентное значение, существует в хеш-таблице. Возвращает значение
false, если значение не найдено
Возвращает значение
true, если некоторый ключ, эквивалентный ключ, существует в хеш-таблице. Возвращает значение

f a l s e
, если ключ не
найден
Возвращает значение
true, если некоторое значение, эквивалентное значение, существует в хеш-таблице. Возвращает значение
false, если значение не найдено
Возвращает перечисление значений, содержащихся в хеш-таблице
Возвращает объект, который содержит значение, ассоциированное с ключ.
Если ключ не найден в хеш- таблице, возвращается значение Возвращает значение
true, если хеш-таблица пуста. Возвращает значение f a l s e , если она содержит хоть одно значение
Возвращает перечисление ключей, содержащихся в хеш-таблице
Вставляет в хеш-таблицу ключи значение. Возвращает значение
null, если ключ не был найден в таблице на момент вставки. В противном случае возвращает предыдущее значение, ассоциированное с этим ключом Увеличивает размер хеш-таблицы и повторно хеширует все ее ключи
Удаляет ключ из хеш-таблицы. Возвращает значение, ассоциированное с ключ.
Если ключ не найден в хеш- таблице, возвращается значение
null________________
Глава 17. Пакет java.util: инфраструктура Collections Fram ew ork
5 3 Окончание табл. 17.22
: * Описание
; ; : ' ,
;
; W ' ; 1 ;.**!
z f H
int Возвращает количество элементов в хеш-таблице
String t o S t r i n g (Возвращает строковый эквивалент хеш-таблицы
Следующий пример представляет переработанную версию программы управления банковскими счетами, показанную ранее, с применением класса
H a s h t a b l e для хранения имен депозиторов и их текущих балансов.
// Демонстрация применения Hashtable.
import java.util.*;
class HTDemo {
public static void main(String a r g s []) {
Hashtable
Double> balance = new Hashtable
Double>();
Enumeration names;
String str;
double b a l Джон Доу", 3434.34);
balance.p u t (Том Смит", 12 3.22);
balance.put("Джейн Бейкер", 1378.00);
balance.p u t ("Тод Холл, 99.22);
balance.put("Ральф Смит", -19.08);
// Показать все счета в хеш-таблице,
names = balance.k e y s ();
while(names.hasMoreElements()) {
str = names.nextElement();
System.out.println(str +
" + balance.g e t (str));
}
System.out.println();
// Добавить 1,000 насчет Джона Доу.
bal = balance.g e t (Джон Доу"); Джон Доу", Новый баланс Джона Доу: " +

balance.g e t (Джон Доу"));
}
}
Вывод этой программы показан ниже.
Тод Холл 99.22
Ральф Смит: -19.08 Джон Доу: 3434.3 4

Джейн Бейкер: 1378.0 Том См и т :

123 .
Новый баланс Джона Доу: 443 4.3 Одно существенное замечание подобно карте, класс
H a s h t a b l e не поддерживает напрямую итераторы. То есть предыдущая программа использует перечисление для отображения содержимого объекта
b a l a n c e . Однако вы можете получить представления хеш-таблицы в виде наборов
(Set), которые допускают использование итераторов. Чтобы сделать это, просто воспользуйтесь одним из методов представления коллекций, определенных в интерфейсе Мар, таким как методе пили. Например, вы можете получить представление в виде

5 3 Часть II. Библиотека набора всех ключей и перебрать его с применением либо итератора, либо усовершенствованного цикла for. Ниже представлена переработанная версия программы, которая демонстрирует эту технику Применение итераторов с Hashtable.
import java.util.*;
class HTDemo2 {
public static void main(String a r g s []) {
Hashtable balance = new Hashtable
Double>();
String str;
double b a l Джон Доу", 3434.34); Том Смит", 123.22);

balance.p u t ("Джейн Бейкер", 1378.00);
balance.put("Тод Холл, 99.22);
balance.p u t ("Ральф Смит", -19.08);
// Отобразить все счета в хеш-таблице.
// Для начала получить ключи в виде набора Получить итератор itr = s e t .iterator();
w h i l e (i t r .hasNext()) {
str = itr.n e x t ();
System.out.println(str + ": " +
balance.g e t (str));
}
System.out.pri n t l n () ;
// Добавить 1 ООО насчет Джона Доу.
bal = balance.g e t (Джон Доу");
balance.p u t (Джон Доу", Новый баланс Джона Доу: " +
balance.g e t (Джон Доу"));
}
}
Класс
P r o p e r t i e Класс
Properties свойства) — это подкласс класса
Hashtable. Он служит для поддержки списков значений, в которых ключами являются объекты класса
String, а значениями — также объекты класса
String. Класс
Properties используется многими другими классами Java. Так, например, это тип объекта, возвращаемого методом
System, get
Properties
( ) , когда извлекаются переменные окружения. Хотя сам класс
Properties не является обобщенным, некоторые его методы используют обобщенный синтаксис.
Класс
Properties определяет следующую переменную экземпляра Эта переменная содержит список свойств по умолчанию, ассоциированных с объектом класса
Properties.
Глава 17. Пакет java.util: инфраструктура Collections Fram ew ork
5 3 В классе P r o p e r t i e s определены следующие конструкторы
свойствоПоУмолчанию)
Первая версия создает объект класса P r o p e r t i e s , не имеющий значений по умолчанию. Вторая создает объект, используя свой ст воП оУ молчанию в качестве значений по умолчанию. В обоих случаях список свойств пуст.
В дополнение к методам, унаследованным классом P r o p e r t i e s от класса
H a sh ta b le , этот класс определяет методы, перечисленные в табл. 17.23. Класс
P r o p e r t i e s также имеет один нежелательный метод s a v e (). Он был заменен методом s t o r e (), поскольку метод s a v e () некорректно обрабатывал ошибки.
Таблица 17.23. Методы, определенные в классе
P r o p e r t i e Описание'
/ Возвращает значение, ассоциированное с ключом ключ.
Если ключа ключ нет нив самом списке свойств, нив списке свойств по умолчанию, то возвращается значение Возвращает значение, ассоциированное с ключ.
Если ключа ключ нет нив самом списке свойств, нив списке свойств по умолчанию, то возвращается свойств оПоУмолчанию
Посылает список свойств в выходной поток, связанный с выходной Поток Посылает список свойств в выходной поток, связанный с выходной Поток Загружает список свойств из входного потока, связанного св ход ной Поток Загружает список свойств из входного потока, связанного св ход ной Поток Загружает список свойств из документа XML, связанного св ход ной Поток Возвращает перечисление ключей. Сюда включаются также ключи, найденные в списке свойств по умолчанию
Ассоциирует значение с ключ.
Возвращает предыдущее значение, ассоциированное с ключом ключ, либо значение
1   ...   41   42   43   44   45   46   47   48   ...   90


написать администратору сайта