Класс хеш-таблицы
Hashtable наследует интерфейс Map и реализует хеш-таблицу сопоставления ключ-значение. Любой ненулевой объект может использоваться в качестве ключа или значения.
Чтобы добавить данные, используйте put(key,value), а для удаления данных используйте get(key). Временные затраты на эти две основные операции постоянны.
Hashtable регулирует производительность с помощью двух параметров: начальной емкости и коэффициента загрузки. Обычно коэффициент загрузки по умолчанию 0,75 обеспечивает лучший баланс между временем и пространством. Увеличение коэффициента загрузки может сэкономить место, но соответствующее время поиска увеличится, что повлияет на такие операции, как получение и размещение.
Простой пример использования Hashtable: поместите 1, 2 и 3 в Hashtable, и их ключи будут «один», «два» и «три» соответственно:
Номера хэш-таблицы = новая Hashtable();
Numbers.put("один", новое целое число(1));
Numbers.put("два", новое целое число(2));
Numbers.put("три", новое целое число(3));
Чтобы получить число, например 2, используйте соответствующую клавишу:
Целое число n = (Целое)numbers.get("два");
System.out.println("два =" + n);
Поскольку объект, используемый в качестве ключа, будет определять положение соответствующего значения путем вычисления своей хеш-функции, любой объект, используемый в качестве ключа, должен реализовывать методы hashCode и Equals. Методы hashCode и Equals наследуются от корневого класса Object. Если вы используете собственный класс в качестве ключа, будьте очень осторожны, согласно определению хеш-функции, если два объекта одинаковы, то есть obj1.equals(. obj2)=true, тогда их хэш-код должен быть То же самое, но если два объекта разные, их хэш-код не обязательно будет разным. Если хэш-код двух разных объектов один и тот же, это явление называется конфликтом. Конфликт увеличит временные затраты на работу с хеш-таблицей, поэтому попробуйте. чтобы правильно его определить. Метод hashCode() может ускорить операции с хеш-таблицами.
Если у одного и того же объекта другой hashCode, операция с хеш-таблицей приведет к неожиданным результатам (ожидаемый метод get возвращает значение null). Чтобы избежать этой проблемы, вам нужно помнить только одно: переопределить метод Equals и метод hashCode одновременно. время. Не пишите только один из них. Хэш-таблица синхронна.
Класс ХэшМап
HashMap похож на Hashtable, за исключением того, что HashMap является асинхронным и допускает значение null, то есть нулевое значение и нулевой ключ. , но при обработке HashMap как коллекции (методvalues() может возвращать коллекцию), затраты времени на его подоперации итерации пропорциональны емкости HashMap. Поэтому, если производительность итеративных операций очень важна, не устанавливайте слишком высокую начальную емкость HashMap или слишком низкий коэффициент загрузки.
Класс WeakHashMap
WeakHashMap — это улучшенный HashMap, который реализует «слабые ссылки» на ключи. Если на ключ больше нет внешних ссылок, ключ может быть переработан GC.
HashSet, пожалуйста, обратитесь к описанию Set
Set — это коллекция, которая не содержит повторяющихся элементов, то есть любые два элемента e1 и e2 имеют e1.equals(e2)=false, а Set содержит не более одного нулевого элемента.
Конструктор Set имеет ограничение, согласно которому переданный параметр Collection не может содержать повторяющиеся элементы.
Обратите внимание: с изменяемыми объектами следует обращаться осторожно. Если изменяемый элемент в Set изменит свое состояние, вызывая Object.equals(Object)=true, это вызовет некоторые проблемы.
Двумя распространенными реализациями Set являются HashSet и TreeSet. Решить, какой из них использовать, довольно просто. HashSet работает намного быстрее (постоянное время по сравнению с временем журнала для большинства операций), но не дает гарантий упорядочивания. Если вам нужно использовать операции в SortedSet или если для вас важна последовательная итерация, используйте TreeSet. В противном случае используйте HashSet. Для вас будет справедливым не использовать HashSet большую часть времени.
При использовании HashSets следует помнить одну вещь: итерация линейна с точки зрения суммы количества записей и емкости. Следовательно, если важна производительность итерации, следует тщательно выбирать подходящую начальную емкость. Выбор слишком большой емкости приводит к потере места и времени. Начальная емкость по умолчанию равна 101, что обычно больше, чем вам нужно. Вы можете использовать конструктор int, чтобы указать начальную емкость. Начальная емкость выделяемого HashSet равна 17:
Set s = новый HashSet(17);
У HashSets также есть «параметр настройки», называемый коэффициентом загрузки. Если вас очень беспокоит использование пространства вашим HashSet, прочитайте подробности в тексте HashSet. В противном случае просто используйте значение по умолчанию. Если вы принимаете коэффициент загрузки по умолчанию, но хотите указать начальную емкость, выберите число, которое примерно в два раза превышает емкость, до которой вы ожидаете, что ваш Набор вырастет. Если ваше предположение неверно, оно может вырасти или просто потратить немного места. Но больших проблем нет. Если вы знаете лучшее значение для правильного размера, используйте его, если не знаете, используйте старое значение или четное значение. На самом деле это не очень важно. Эти вещи лишь делают HashSet немного лучше.
TreeSet не имеет параметров настройки. Помимо клонирования, HashSet и TreeSet имеют только те операции, которые требуются их соответствующими интерфейсами (Set и TreeSet), и никаких других операций.