Java как сохранить hashmap в файл

Обновлено: 07.07.2024

Реализации HashMap в Java Collections Framework

HashMap имеет следующие особенности:

  • Коэффициент загрузки по умолчанию и начальная мощность 0,75 и 16 соответственно. Их значения важны для производительности HashMap, поскольку они могут оптимизировать производительность итераций и количество операций изменения размера и повторного хеширования.
  • Нет гарантий порядка итераций.
  • Производительность итерации зависит от начальной емкости (количества сегментов) плюс количества записей. Таким образом, очень важно не устанавливать слишком высокую начальную мощность (или слишком низкий коэффициент загрузки).
  • Никаких повторяющихся ключей. Разрешает один нулевой ключ и несколько нулевых значений.
  • Проблема коллизии хэша решена за счет использования древовидной структуры данных, начиная с Java 8, для обеспечения отдельной цепочки.
  • Предлагает постоянное время O (1) в среднем и линейное время O (n) в худшем случае производительность для основных операций, таких как получение, размещение и удаление.
  • Чем меньше повторяющихся хэш-кодов, тем выше прирост производительности для вышеуказанных операций.
  • Ключевые объекты сравниваются на основе их равенства и реализации hashCode.
  • Объекты значений сравниваются на основе реализации их метода равенства.
  • HashMap не является потокобезопасным, поскольку это несинхронизированная реализация.
  • В многопоточном окружении хотя бы один поток изменяет карту, она должна быть синхронизирована извне.

Давайте пройдемся по этому руководству, чтобы изучить их более подробно.

HashMap против LinkedHashMap и TreeMap

HashMap не имеет гарантий упорядочивания и работает быстрее, чем TreeMap (постоянное время по сравнению с временем журнала для большинства операций)

LinkedHashMap обеспечивает итерацию с упорядоченной вставкой и работает почти так же быстро, как HashMap.

TreeMap обеспечивает итерацию по порядку значений. TreeMap можно использовать для сортировки HashMap или LinkedHashMap

Объявление HashMap

В результате иерархии классов вы можете объявить HashMap следующими способами:

Создание и инициализация

Предоставьте фабричный метод Map.of или Map.ofEntries, начиная с Java 9, в конструктор HashMap (Map) для создания и инициализации HashMap в одной строке во время создания.

Вы также можете инициализировать HashMap после времени создания, используя put, Java 8+ putIfAbsent, putAll.

Итерация HashMap

Вы можете перебирать пары ключ-значение HashMap, используя Java 8+ forEach (BiConsumer).

Итерировать по HashMap keySet() или values() с Java 8+ forEach(Consumer).

Получение и фильтрация

Используйте entrySet(), keySet(), values(), чтобы получить набор записей сопоставления ключ-значение, набор ключей и набор значений соответственно.

Получить значение по указанному ключу с помощью get(key).

Фильтрация ключей или значений HashMap с помощью Java 8+ Stream API.

Добавление, обновление и удаление

HashMap предоставляет методы containsKey (ключ), containsValue (значение), put (ключ, значение), replace (ключ, значение) и remove (ключ), чтобы проверить, содержит ли HashMap указанный ключ или значение, чтобы добавить новый ключ. пара значений, обновить значение по ключу, удалить запись по ключу соответственно.

Сравнение объектов в HashMap

Внутренне основные операции HashMap, такие как containsKey, containsValue, put, putIfAbsent, replace и remove, работают на основе сравнения объектов элементов, которые зависят от их равенства и реализации hashCode.

В следующем примере ожидаемые результаты не достигаются из-за отсутствия реализации equals и hashCode для определенных пользователем объектов.

Вы можете решить указанную выше проблему, переопределив equals и hashCode, как показано в примере ниже.

Сортировка HashMap

В Java нет прямого API для сортировки HashMap. Однако вы можете сделать это через TreeMap, TreeSet и ArrayList вместе с Comparable и Comparator.

В следующем примере используются статические методы comparingByKey (Comparator) и comparingByValue (Comparator) для Map.Entry для сортировки ArrayList по ключам и по значениям соответственно. Этот ArrayList создается и инициализируется из entrySet() HashMap.

@Test
public void sortByKeysAndByValues_WithArrayListAndComparator() Map.Entry e1 = Map.entry("k1", 1);
Map.Entry e2 = Map.entry("k2", 20);
Map.Entry e3 = Map.entry("k3", 3);

Map map = new HashMap<>(Map.ofEntries(e3, e1, e2));

List > arrayList1 = new ArrayList<>(map.entrySet());
arrayList1.sort(comparingByKey(Comparator.naturalOrder()));
assertThat(arrayList1).containsExactly(e1, e2, e3);

List > arrayList2 = new ArrayList<>(map.entrySet());
arrayList2.sort(comparingByValue(Comparator.reverseOrder()));
assertThat(arrayList2).containsExactly(e2, e3, e1);
>
Ниже представлен полный пример исходного кода.

public class HashMapTest @Test
public void declare() Map map1 = new HashMap<>();
assertThat(map1).isInstanceOf(HashMap.class);

HashMap map2 = new HashMap<>();
>

@Test
public void initInOneLineWithFactoryMethods() // create and initialize a HashMap from Java 9+ Map.of
Map map1 = new HashMap<>((Map.of("k1", 1, "k3", 2, "k2", 3)));
assertThat(map1).hasSize(3);

// create and initialize a HashMap from Java 9+ Map.ofEntries
Map map2 = new HashMap<>(Map.ofEntries(Map.entry("k4", 4), Map.entry("k5", 5)));
assertThat(map2).hasSize(2);
>

@Test
public void initializeWithPutIfAbsent() // Create a new HashMap
Map map = new HashMap<>();

// Add elements to HashMap
map.putIfAbsent("k1", 1);
map.putIfAbsent("k2", 2);
map.putIfAbsent("k3", 3);

// Can add null key and value
map.putIfAbsent(null, 4);
map.putIfAbsent("k4", null);

// Duplicate key will be ignored
map.putIfAbsent("k1", 10);
assertThat(map).hasSize(5);

// The output ordering will be vary as HashMap is not reserved the insertion order
System.out.println(map);
>

@Test
public void iterateOverKeyValuePairs() Map map = new HashMap<>(Map.of("k1", 1, "k2", 2));
map.forEach((k, v) -> System.out.printf("%s=%d ", k, v));
>

@Test
public void iterateOverKeySet() Map map = new HashMap<>(Map.of("k1", 1, "k2", 2));
map.values().forEach(k -> System.out.printf("%s ", k));
>

@Test
public void retrieve() Map hashMap = new HashMap<>(Map.of("k1", 1, "k2", 2));

Set > entrySet = hashMap.entrySet();
assertThat(entrySet).contains(Map.entry("k1", 1), Map.entry("k2", 2));

Set keySet = hashMap.keySet();
assertThat(keySet).contains("k1", "k2");

Collection values = hashMap.values();
assertThat(values).contains(1, 2);
>

@Test
public void getValueByKey() Map map = new HashMap<>(Map.of("k1", 1, "k2", 2));
int value = map.get("k1");

@Test
public void filter() Map map = new HashMap<>(Map.of("k1", 1, "k2", 2));
Integer[] arr = map.values().stream().filter(v -> v > 1).toArray(Integer[]::new);
assertThat(arr).contains(2);
>

@Test
public void containsPutReplaceRemove() Map map = new HashMap<>(Map.of("k1", 1, "k2", 2));

boolean containedKey = map.containsKey("k1");
assertThat(containedKey).isTrue();

boolean containedValue = map.containsValue(2);
assertThat(containedValue).isTrue();

map.put("k3", 3);
assertThat(map).hasSize(3);

map.replace("k1", 10);
assertThat(map).contains(Map.entry("k1", 10), Map.entry("k2", 2), Map.entry("k3", 3));

map.remove("k3");
assertThat(map).contains(Map.entry("k1", 10), Map.entry("k2", 2));
>

@Test
public void objectsComparingProblem() Map hashMap = new HashMap<>();

hashMap.put(new Category(1, "c1"), new Book(1, "b1"));

boolean containedKey = hashMap.containsKey(new Category(1, "c1"));
assertThat(containedKey).isFalse();

boolean containedValue = hashMap.containsValue(new Book(1, "b1"));
assertThat(containedValue).isFalse();

hashMap.put(new Category(1, "c1"), new Book(1, "b1"));
assertThat(hashMap).hasSize(2);

Book previousValue = hashMap.replace(new Category(1, "c1"), new Book(2, "b1"));
assertThat(previousValue).isNull();

hashMap.remove(new Category(1, "c1"));
assertThat(hashMap).hasSize(2);
>

static class Category int id;
String name;

Category(int id, String name) this.id = id;
this.name = name;
>
>

static class Book int id;
String title;

Book(int id, String title) this.id = id;
this.title = title;
>
>

@Test
public void objectsComparingFixed() Map hashMap = new HashMap<>();

hashMap.put(new CategoryFixed(1, "c1"), new BookFixed(1, "b1"));

boolean containedKey = hashMap.containsKey(new CategoryFixed(1, "c1"));
assertThat(containedKey).isTrue();

boolean containedValue = hashMap.containsValue(new BookFixed(1, "b1"));
assertThat(containedValue).isTrue();

hashMap.put(new CategoryFixed(1, "c1"), new BookFixed(1, "b1"));
assertThat(hashMap).hasSize(1);

BookFixed previousValue = hashMap.replace(new CategoryFixed(1, "c1"), new BookFixed(2, "b1"));
assertThat(previousValue).isNotNull();

hashMap.remove(new CategoryFixed(1, "c1"));
assertThat(hashMap).hasSize(0);
>

static class CategoryFixed int id;
String name;

CategoryFixed(int id, String name) this.id = id;
this.name = name;
>

@Override
public boolean equals(Object o) if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
CategoryFixed that = (CategoryFixed) o;
return that.id &&
Objects.equals(name, that.name);
>

@Override
public int hashCode() return Objects.hash(id, name);
>
>

static class BookFixed int id;
String title;

BookFixed(int id, String title) this.id = id;
this.title = title;
>

@Override
public boolean equals(Object o) if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
BookFixed bookFixed = (BookFixed) o;
return bookFixed.id &&
Objects.equals(title, bookFixed.title);
>

@Override
public int hashCode() return Objects.hash(id, title);
>
>

@Test
public void sortByKeysAndByValues_WithArrayListAndComparator() Map.Entry e1 = Map.entry("k1", 1);
Map.Entry e2 = Map.entry("k2", 20);
Map.Entry e3 = Map.entry("k3", 3);

Map map = new HashMap<>(Map.ofEntries(e3, e1, e2));

List > arrayList1 = new ArrayList<>(map.entrySet());
arrayList1.sort(comparingByKey(Comparator.naturalOrder()));
assertThat(arrayList1).containsExactly(e1, e2, e3);

List > arrayList2 = new ArrayList<>(map.entrySet());
arrayList2.sort(comparingByValue(Comparator.reverseOrder()));
assertThat(arrayList2).containsExactly(e2, e3, e1);
>
>

Средняя оценка / 5. Количество голосов:

Спасибо, помогите другим - напишите комментарий, добавьте информации к статье.

Задача моей программы в том, что бы пользователь мог создавать заказы и после нажатия на кнопку "сохранить заказы" - ВСЕ введеные заказы сохраняются в файле. В моем случае только последний заказ сохраняется в файле, а первые куда то проподают

возможно ошибка в параметрах методов или то что нужно возращать, я не всегда знаю что нужно вернуть и какие параметры указать в методах, но точно не знаю __________________
Помощь в написании контрольных, курсовых и дипломных работ здесь

Вставка HashMap в HashMap меняет все элементы
Вставляю HashMap в HashMap генерируя карту доски для шахмат, привожу тестовый пример, вставляется.

Сохранение в текстовом файле
Вообще-м ,есть задание,нужно создать класс для хранение информации в текстовом документе там.


Сохранение массива в файле
:wall: Добавлено через 37 минут тип double

Сохранение БД в txt файле
Всем доброго времени суток. Такой вопрос можно ли при сохранении базы данных сразу указать ее.

в 10 строке с каждым новым заказом ты перезаписываешь старое значение! а по идее ты должен у ордерс спросить нет ли уже ключа с текущей датой, если есть то взять по этому ключу мапу Map<Integer, OrderDTO> и добавит туда новый заказ. А у тебя логика метода совсем другая - хранит только последний заказ

Решение

большое спасибо, ArtemFM. Все работает теперь. Понятно в чем была ошибка

Добавлено через 2 минуты
Спасибо, Welemir1.
Не знаю как работать с дебагером. Спасибо за ссылку, почитаю и посмотрю видео на ютюб что б разобраться в этом

Сохранение в res файле
Я точно не знаю есть ли такие файлы. Если есть, как сохранить например такой текст внутри них &quot;Это.


Сохранение в текстовом файле
Здравствуйте, вопрос такой:Как сохранить информацию в текстовом документе с изменением.Я просто.

У меня есть объект типа HashMap<Integer, MyObject> в котором около 2 млн пар.

Объект "горячий" - постоянно идет вызов get() и работа с MyObject.

Информация в HashMap важная, поэтому её нужно периодически сохранять на диск, что называется, "на лету". Где-то 20-30 МБ.

Подскажите, как лучше всего это организовать? Заранее спасибо.

У меня есть объект типа HashMap<Integer, MyObject> в котором около 2 млн пар.

Объект "горячий" - постоянно идет вызов get() и работа с MyObject.

Информация в HashMap важная, поэтому её нужно периодически сохранять на диск, что называется, "на лету". Где-то 20-30 МБ.

Подскажите, как лучше всего это организовать? Заранее спасибо.

В итоге я пока пошел таким путем - сохраняю операции (которые изменяют объект MyObject) на диск при вызове самой операции, а после перезагрузки восстанавливаю по файлам значение поля int путем пересчета операций.

Не знаю насколько это будет надежно и быстро, ещё не тестил под нагрузкой.

В итоге я пока пошел таким путем - сохраняю операции (которые изменяют объект MyObject) на диск при вызове самой операции, а после перезагрузки восстанавливаю по файлам значение поля int путем пересчета операций.

===== это ты случайно не хибер написал?

В итоге я пока пошел таким путем - сохраняю операции (которые изменяют объект MyObject) на диск при вызове самой операции, а после перезагрузки восстанавливаю по файлам значение поля int путем пересчета операций.

Ну я все сервера SQL не знаю, может каким-то наплевать на такие таблицы, если не создавать никакие Constraints

Java DB надо попробовать, вроде все просто.

Ну я все сервера SQL не знаю, может каким-то наплевать на такие таблицы, если не создавать никакие Constraints

Java DB надо попробовать, вроде все просто.

Какие SQL сервера пробовали? Записывать данные эффективнее SQL сервера и поддерживая транзакционность (ACID) очень не просто, особенно на малых объемах.

Привет! Сегодня мы поговорим о еще одной структуре данных — Map. Ее официальное русское название — “ассоциативный массив”, но его используют нечасто. Более распространены варианты “словарь”, “карта”, или (чаще всего) — сленговый англицизм “мапа” :) Внутри Map данные хранятся в формате “ключ”-”значение”, то есть по парам. И в качестве ключей, и в качестве значений могут выступать любые объекты — числа, строки или объекты других классов.

Отличие Map от других структур данных

Создание HashMap в Java и работа с классом

Создается данная реализация очень просто: Здесь мы создали словарь, в котором элементы будут храниться в формате “число-строка”. Число будет выступать ключом, а строка — значением. Также мы указали какого типа у нас будут ключи ( Integer ), а какого — значения ( String ). Почему именно так? Во-первых, ключ в HashMap всегда является уникальным. Для нас это отлично подойдет, поскольку мы сможем использовать номер паспорта в качестве ключа и избежать повторов. А строка с ФИО будет выступать значением (ФИО у разных людей легко могут повторяться, в этом ничего страшного для нас нет).

Добавление новой пары в HashMap

Данная задача выглядит так: Для этого используется метод put() . Кроме того, HashMap имеет переопределенный метод toString() , поэтому ее можно выводить на консоль. Вывод будет выглядеть так:

Особенности ключей HashMap

Теперь давай проверим, действительно ли ключи являются уникальными? Попробуем добавить новый элемент с уже имеющимся в мапе ключом: Вывод: Предыдущий элемент с ключом 162348, как видишь, был перезаписан. “Ключ” назвали ключом не просто так. Доступ к значениям в HashMap осуществляется по ключу (но никак не наоборот — ключ нельзя получить по значению, ведь значения могут быть повторяющимися). Это хорошо видно на примерах получения элемента, а также удаления элемента из HashMap: Для того, чтобы получить значение, или удалить пару из словаря, мы должны передать в методы get() и remove() именно уникальный ключ, соответствующий этому значению. Номерных индексов, как в массивах или списках, в HashMap нет — доступ к значению осуществляется по ключу. Вывод в консоль: Лидия Аркадьевна Бубликова

Проверка наличия ключа и значения

В классах ArrayList и LinkedList мы могли проверить, содержится ли в списке какой-то конкретный элемент. HashMap тоже позволяет это делать, причем для обеих частей пары: у нее есть методы containsKey() (проверяет наличие какого-то ключа) и containsValue() (проверяет наличие значения). Вывод: false true

Получение списка всех ключей и значений

Еще одна удобная особенность HashMap — можно по-отдельности получить список всех ключей и всех значений. Для этого используются методы keySet() и values() : Ключи извлекаются в коллекцию Set . Ее особенность в том, что в ней не может быть повторяющихся элементов. Сейчас главное запомни, что список всех ключей можно вынести из HashMap в отдельную коллекцию. Значения мы в примере сохранили в обычный ArrayList . Вывод в консоль: Ключи: [212133, 8082771, 162348] Значения: [Лидия Аркадьевна Бубликова, Дональд Джон Трамп, Иван Михайлович Серебряков] Методы size() и clear() делают ровно то же самое, что и в предыдущих структурах, которые мы проходили: первый — возвращает число элементов в словаре на текущий момент, второй — удаляет все элементы. Вывод: 3 <> Для проверки того, есть ли в нашей HashMap хотя бы один элемент, можно использовать метод isEmpty() : Вывод: Теперь вывод на консоль у нас будет осуществляться только после предварительной проверки:)


Привет! Это статья про Карты (Map), один из способов хранения данных в Java.

К сожалению, карта (Map) в Java не имеет никакого отношения к картам из реального мира 🙂 Ну или почти никакого.

В программировании, карта (Map) - это структура данных, в которой объекты хранятся не по одному, как во всех остальных, а в паре "ключ - значение".


Ну вот представьте, что у нас есть обычный массив строк, в котором хранятся, например, имена людей - Вася, Катя, Лена:


Тем не менее, в карте мы храним пары "ключ-значение" - и обращаться к элементам мы будем не по индексам, а по ключам. В нашем случае ключ - это дата рождения:


Причем ключем может быть что угодно - число, строка или какой-нибудь другой объект.

Какие есть виды карт (map) в Java

Cреди основных реализаций можно назвать:

Если представить в виде диаграммы, будет выглядеть так:


Но для начала этого явно многовато 🙂 Поэтому по теме "map в Java" мы чуть позже напишем несколько статей. А пока эта статья будет как вводная с основным акцентом на HashMap.

Давайте посмотрим, чем они друг от друга отличаются.

  • HashMap - хранит значения в произвольном порядке, но позволяет быстро искать элементы карты. Позволяет задавать ключ или значение ключевым словом null.
  • LinkedHashMap - хранит значения в порядке добавления.
  • TreeMap - сама сортирует значения по заданному критерию. TreeMap используется либо с Comparable элементами, либо в связке с Comparator. Смотрите статью "Интерфейсы Comparable и Comparator".
  • Hashtable - как HashMap, только не позволяет хранить null и синхронизирован с точки зрения многопоточности - это значит, что много потоков могут работать безопасно с Hashtable. Но данная реализация старая и медленная, поэтому сейчас уже не используется в новых проектах.

Можно сказать, что для начала Вам хватит знать и уметь работать с HashMap. Именно на ней мы и будем приводить примеры.

Синтаксис HashMap

Создание объекта типа Map похоже на создание коллекций - только мы должны задавать два типа - тип ключа и тип значения:

Читайте также: