Класс Hashtable
Класс Hashtable расширяет абстрактный класс Dictionary . В объектах этого класса хранятся пары «ключ — значение».
Из таких пар «Фамилия И. О. — номер» состоит, например, телефонный справочник.
Еще один пример — анкета. Ее можно представить как совокупность пар «Фамилия — Иванов», «Имя — Петр», «Отчество — Сидорович», «Год рождения — 1975» и т. д.
Подобных примеров можно привести множество.
Каждый объект класса Hashtable кроме размера (size) — количества пар, имеет еще две характеристики: емкость (capacity) — размер буфера, и показатель загруженности (load factor) — процент заполненности буфера, по достижении которого увеличивается его размер.
Как создать таблицу
Для создания объектов класс 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.
Как заполнить таблицу
Для заполнения объекта класса Hashtable используются два метода:
Object put(Object key, Object value) — добавляет пару » key— value «, если ключа key не было в таблице, и меняет значение value ключа key , если он уже есть в таблице. Возвращает старое значение ключа или pull , если его не было. Если хотя бы один параметр равен null , возникает исключительная ситуация;
void putAii(Map f) — добавляет все элементы отображения f . В объектах-ключах key должны быть реализованы методы hashCode() и equals ().
Как поучить значение по ключу
Метод get (Object key) возвращает значение элемента с ключом key в виде объекта класса object . Для дальнейшей работы его следует преобразовать к конкретному типу.
Как узнать наличие ключа или значения
Логический метод containsKey(object key) возвращает true , если в таблице есть ключ key .
Логический метод containsvalue (Object value) или старый метод contains (object value) возвращают true , если в таблице есть ключи со значением value .
Логический метод isEmpty () возвращает true , если в таблице нет элементов.
Как получить все элементы таблицы
Метод values () представляет все значения value таблицы в виде интерфейса Collection . Все модификации в объекте collection изменяют таблицу, и наоборот.
Метод keyset () предоставляет все ключи key таблицы в виде интерфейса set . Все изменения в объекте set корректируют таблицу, и наоборот.
Метод entrySet() представляет все пары » key— value « таблицы в виде интерфейса Set . Все модификации в объекте set изменяют таблицу, и наоборот.
Метод tostring () возвращает строку, содержащую все пары.
Старые методы elements () и keys () возвращают значения и ключи в виде интерфейса Enumeration .
Как удалить элементы
Метод remove (Object key) удаляет пару с ключом key , возвращая значение этого ключа, если оно есть, и null , если пара с ключом key не найдена.
Метод clear о удаляет все элементы, очищая таблицу.
В листинге 6.3 показано, как можно использовать класс Hashtabie для создания телефонного справочника.
Листинг 6.3. Телефонный справочник
import java.util.*;
class PhoneBook{
public static void main(String[] args){
Hashtabie yp = new Hashtabie();
String name = null;
yp.put(«John», «123-45-67»);
yp.put («Lemon», «567-34-12»);
yp.put(«Bill», «342-65-87»);
yp.put(«Gates», «423-83-49»);
yp.put(«Batman», «532-25-08»);
try{
name = args[0];
(catch(Exception e){
System.out.println(«Usage: Java PhoneBook Name»);
return;
}
if (yp.containsKey(name))
System.out.println(name + «‘s phone = » + yp.get(name));
else
System.out.println(«Sorry, no such name»);
)
}
Класс Properties
Класс ‘ Properties расширяет класс Hashtabie . Он предназначен в основном для ввода и вывода пар свойств системы и их значений. Пары хранятся в виде строк типа string . В классе Properties два конструктора:
Properties () — создает пустой объект;
Properties (Properties default) — создает объект с заданными парами свойств default .
Кроме унаследованных от класса Hashtabie методов в классе Properties есть еще следующие методы.
Два метода, возвращающих значение ключа-строки в виде строки:
- string getProperty (string key) — возвращает значение по ключу key ;
- String getProperty(String.key, String defaultValue) — возвращает значение по ключу key ; если такого ключа нет, возвращается defaultValue .
Метод setProperty(String key, String value) добавляет новую пару, если ключа key нет, и меняет значение, если ключ key есть.
Метод load(Inputstream in ) загружает свойства из входного потока in .
Методы list(PrintStream out) И list (PrintWriter out) выводят свойства в выходной поток out.
Метод store (OutputStream out, String header) выводит свойства в выходной поток out с заголовком header .
Очень простой листинг 6.4 демонстрируют вывод всех системных свойств Java.
Листинг 6.4. Вывод системных свойств
class Prop{
public static void main(String[] args){
System.getProperties().list(System.out);
}
}
Примеры классов Vector, Stack, Hashtabie, Properties показывают удобство классов-коллекций. Поэтому в Java 2 разработана целая иерархия коллекций. Пунктирные линии указывают классы, реализующие эти интерфейсы. Все коллекции разбиты; на три группы, описанные в интерфейсах List, Set и Map.
Примером реализации интерфейса List может служить класс Vector , примером реализации интерфейса мар — класс Hashtabie .
Коллекции List и set имеют много общего, поэтому их общие методы объединены и вынесены в суперинтерфейс Collection .
Посмотрим, что, по мнению разработчиков Java API, должно содержаться в этих коллекциях.