JavaRush/Java блог/Архив info.javarush/Вопрос по добавлению элементов в множество Set
ilia_ta
19 уровень

Вопрос по добавлению элементов в множество Set

Статья из группы Архив info.javarush
участников
Здравствуйте! Недавно писал программу решения одной задачи в java, в ней в цикле шел перебор возможных решений. Решение представляет собой массив известной длины. Создал множество таких массивов solutions, в которое в цикле добавлял подходящие решения (они были в массиве sol): solutions.add(sol); Первое найденное решение добавлялось, а вот последующие уже нет. Первая мысль -- решение повторяется, но нет, они все оригинальные... Решения стали добавляется после добавления процедуры clone(): solutions.add(sol.clone()); Почему первый вариант команды не добавлял элементы, а второй -- добавлял?
Комментарии (6)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Byshevsky
Уровень 16
12 марта 2016, 09:34
буквально вчера читал Вопросы на собеседовании по коллекциям и там есть такое, может тебе поможет:
14. Почему нельзя использовать byte[] в качестве ключа в HashMap?
Как обычно, все оказалось довольно просто — хеш-код массива не зависит от хранимых в нем элементов, а присваивается при создании массива (метод вычисления хеш-кода массива не переопределен и вычисляется по стандартному Object.hashCode() на основании адреса массива). Так же у массивов не переопределен equals и выполняет сравнение указателей. Это приводит к тому, что обратиться к сохраненному с ключом-массивом элементу не получится при использовании другого массива такого же размера и с такими же элементами, доступ можно осуществить лишь в одном случае — при использовании той же самой ссылки на массив, что использовалась для сохранения элемента.
ilia_ta
Уровень 19
12 марта 2016, 16:36
Спасибо за полезный материал!
mrserfr
Уровень 33
12 марта 2016, 01:38
equals hashcode переопределил? это первое, что на ум приходит. если нет — там сравнение по ссылке. без кода не понять…
ilia_ta
Уровень 19
12 марта 2016, 02:58
Совсем забыл про ссылки у сложных типов, действительно, equals выводит true при сравнении элементов множества и нового массива… Спасибо!
AndreGold
Уровень 28
12 марта 2016, 01:36
увидеть бы код
ilia_ta
Уровень 19
12 марта 2016, 02:43
Объявления множества и массива:

    public static Set<int[]> solutions = new HashSet<int[]>();
    int[] sol = new int[n1+n2];