#java #map #коллекции #множества
Есть простой класс: public class Person { private int age; private String name; public Person(int age, String name) { this.age = age; this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Person [age=" + age + ", name=" + name + "]"; } } Есть еще один класс: public class Item{ private K key; private P person; public Item(K key, P person) { this.key = key; this.person = person; } public K getKey() { return key; } public void setKey(K key) { this.key = key; } public P getPerson() { return person; } public void setPerson(P person) { this.person = person; } @Override public String toString() { return "Item [key=" + key + ", person=" + person + "]"; } } ГДЕ ПРАВДА??? И сама реализация классов: public class Main { public static void main(String[] args) { Set - > set = new HashSet
- >(); set.add(new Item
(1, new Person(23, "gogo"))); set.add(new Item (2, new Person(42, "niko"))); set.add(new Item (3, new Person(32, "toto"))); Iterator - > iter = set.iterator(); while (iter.hasNext()) { System.out.println(iter.next()); } Map
map = new HashMap (); map.put(1, new Person(12, "anton")); map.put(2, new Person(42, "valera")); map.put(3, new Person(41, "vova")); Iterator iter1 = map.entrySet().iterator(); while (iter1.hasNext()) { System.out.println(iter1.next()); } } }
Ответы
Ответ 1
Это принципиально разные структуры данных и используются они для разных целей. Set - это множество, то самое математическое множество. И соответственно использовать его надо как множество, т.е. хранить набор уникальных элементов. Map - это ассоциированный массив, который хранит пары ключ-значение, где ключ должен быть уникальным, а значение нет. Соответственно выбор правильной структуры надо делать на основе того какие действия над этими данными вы собираетесь делать. Если только хранить набор уникальных значений и проверять, что такое значение уже есть в структуре данных, то это Set. Если вам необходимо периодически искать значение по ключу(например по ИД), то это Map. Если же вам надо хранить просто список объектов и периодически проходить по всем элементам этого списка(как в ваших примерах), то надо использовать List. Относительно вопроса о временах операций, есть такие замечательные ссылки, где все хорошо описано для Java: https://github.com/benblack86/java-snippets/blob/master/resources/java_collections.pdf для Абстракций: http://bigocheatsheet.com/ Все они приведены в терминах Big-O нотаций, что это в принципе такое, можно почитать тут.Ответ 2
Обход всех элементов Map — не самая нужная операция. Самая популярная и важная — быстро получить значение по ключу. Для такого сценария ваш Set не годится: вы не можете это сделать эффективно (не перебирая все ключи). Поэтому Map нужен. Уместнее обратный вопрос: зачем HashSet, если его можно реализовать, например, через HashMap и получить действительно все операции? По факту HashSet примерно так и реализован (он внутри хранит HashMap). Существует он отдельным классом по большей части для удобства. Также замечу, что ваш Item реализован неправильно: даже в вашем сценарии вы не исключаете одинаковый элементов в Set (у вас используется Object.equals и Object.hashCode по умолчанию, соответственно элементы сравниваются по reference equality).
Комментариев нет:
Отправить комментарий