Еще один пример коллекции совсем другого рода — таблицы — предоставляет класс
Hashtable.
Класс
Класс Hashtable расширяет абстрактный класс Dictionary. В объектах этого класса хранятся пары "ключ — значение". Их можно представить себе как таблицу из двух столбцов. Такие таблицы часто называют
Из таких пар "Фамилия И. О. — номер телефона" состоит, например, телефонный справочник.
Еще один пример — анкета. Ее можно представить как совокупность пар "Фамилия — Иванов", "Имя — Петр", "Отчество — Сидорович", "Год рождения — 1975" и т. д.
Подобных примеров можно привести множество.
Каждый объект класса Hashtable кроме
Для создания объектов класс Hashtable предоставляет четыре конструктора:
□ Hashtable () — создает пустой объект с начальной емкостью в 101 элемент и показателем загруженности 0,75;
□ Hashtable (int capacity) -формирует пустой объект с начальной емкостью capacity и
показателем загруженности 0,75;
□ Hashtable (int capacity, float loadFactor) — создает пустой объект с начальной емкостью capacity и показателем загруженности loadFactor;
□ Hashtable (Map f) — создает объект класса Hashtable, содержащий все элементы отображения f, с емкостью, равной удвоенному числу элементов отображения f, но не менее 11, и показателем загруженности 0,75.
Если предполагается хранить в таблице пары определенных типов, то эти типы можно указать заранее при создании таблицы. Для этого в угловых скобках в шаблоне (generics) коренного типа записываются конкретные типы по такой схеме:
Hashtable
или, используя "ромбовидный оператор",
Hashtable
После такого определения компилятор будет следить за типами заносимых в таблицу элементов. Извлечение элементов из таблицы не потребует явного приведения типов.
Для заполнения объекта класса Hashtable используются два метода:
□ Object put(Object key, Object value) — добавляет пару "key — value", если ключа key не было в таблице, и меняет значение value ключа key, если он уже есть в таблице. Возвращает старое значение ключа или null, если его не было. Если хотя бы один аргумент равен null, возникает исключительная ситуация;
□ void putAll (Map f) — добавляет все элементы отображения f.
В объектах-ключах key должны быть переопределены методы hashCode() и equals ( ), унаследованные от класса Object.
Метод get (Object key) возвращает значение элемента с ключом key в виде объекта класса Obj ect или того класса, с которым создана таблица. Если при создании таблицы класс не был указан, то для дальнейшей работы с полученным объектом его следует преобразовать к конкретному типу.
Логический метод containsKey(Object key) возвращает true, если в таблице есть ключ
key.
Логический метод containsValue(Object value) или старый метод contains(Object value) возвращают true, если в таблице есть ключи со значением value.
Логический метод isEmpty() возвращает true, если в таблице нет элементов.
Метод values ( ) представляет все значения value таблицы в виде объекта типа Collection. Все модификации в этом объекте изменяют таблицу, и наоборот.
Метод keySet () предоставляет все ключи key таблицы в виде объекта типа интерфейса Set. Все изменения в этом объекте типа Set корректируют таблицу, и наоборот.
Метод entrySet () представляет все пары "key — value" таблицы в виде объекта типа интерфейса Set. Все модификации в этом объекте типа Set изменяют таблицу, и наоборот.
Итак, таблицу типа Hashtable можно представить в трех формах: в виде коллекции значений, в виде множества ключей или в виде множества пар.
Метод toString () возвращает строку, содержащую все пары таблицы.
Старые методы elements () и keys () возвращают значения и ключи в виде интерфейса
Enumeration.
Метод remove (Obj ect key) удаляет пару с ключом key, возвращая значение этого ключа, если оно есть, и null, если пара с ключом key не найдена.
Метод clear () удаляет все элементы, очищая таблицу.
В листинге 6.3 показано, как можно использовать класс Hashtable для создания телефонного справочника, а на рис. 6.1 — вывод этой программы.
import java.util.*; class PhoneBook{
public static void main(String[] args){
Hashtable
String name = null;
yp.put("John", "123-45-67");