Класс 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, должно содержаться в этих коллекциях.