#java #хеширование #коллекции
import java.util.HashSet; import java.util.Set; public class Main2 { public static void main(String[] args) { Setintset = new HashSet (); intset.add(1); intset.add(2); intset.add(35); intset.add(42); intset.add(5); intset.add(6); intset.add(7); intset.add(832); intset.add(9); intset.add(1000); intset.add(11); intset.add(12); intset.add(13); intset.add(14); System.out.println("hash set: "+intset); } } // Output: // hash set: [1, 2, 5, 6, 7, 9, 11, 12, 13, 14, 35, 42, 832, 1000]
Ответы
Ответ 1
Нет, не сортирует. Вам просто повезло, что числа оказались упорядочены на вашей версии Java. Вероятно, это связано с тем, что на вашей версии над хэшкодом не делается дополнительных преобразований, а хэшкод целого числа — это само число. Но никто не гарантирует, будут делаться преобразования или нет. Естественно, алгоритм хэширования не стохастический: если один раз получилось упорядочено, то и другой раз получится. Но тем не менее никто не гарантирует, что порядок сохранится на другой машине или в другой версии Java. К примеру, Oracle JDK 7u60 выдаёт: >"C:\Program Files\Java\jdk1.7.0_60\bin\java.exe" Main2 hash set: [1000, 35, 1, 832, 2, 5, 6, 7, 42, 9, 11, 12, 13, 14] А Oracle JDK 8u60 выдаёт: >"C:\Program Files\Java\jdk1.8.0_60\bin\java.exe" Main2 hash set: [832, 1, 2, 35, 5, 6, 7, 1000, 9, 42, 11, 12, 13, 14] У вас, наверно, какая-нибудь Java на андроиде, в которой своя библиотека классов (порождённая Apache Harmony). В других версиях Java порядок может отличаться.Ответ 2
Когда вы конкатенируете HashSet со строкой ("hash set: "+intset), коллекция приводится к строковому типу неявным вызовом метода toString(). Сам метод toString() определен в классе java.util.AbstractCollection, который, в свою очередь, для перечисления элементов коллекции обращается к java.util.HashSet#iterator. И вот, что говорит JavaDoc этого метода: /** * Returns an iterator over the elements in this set. The elements * are returned in no particular order. */ То есть итерация по элементам множества не обещает какой-либо конкретный порядок. Кроме того в самом начале JavaDoc класса HashSet мы видим: It makes no guarantees as to the iteration order of the set; in particular, it does not guarantee that the order will remain constant over time. То есть никаких гарантий на порядок обхода вообще нет, а если вы заметили какой-то порядок, то он может в следующий раз быть другим.Ответ 3
Итак, дорогие мои. Отвечаю на собственный вопрос. Все мы ми знаем, или не все, что HashSet это тотже самое что и HashMap, только у HashSet -> values всегда null. Когда мы инициализируем HashSet или HashMap с конструктором по умолчанию, то создается масив на 16 корзин в котором будет содержатся "информация"(!) о hashCode обєкта ключа, которая будет соответствовать індексу корзины масива, где и будет содержатся ссылка на цельный обект(пара(ключ и значение)). Логически получается следующее, что если вы будете в качестве обекта ключа использовать клас Integer со значением в диапазоне от 0 - 15, то hashCode вам вернет само значение обєкта Integer, а это значение и будет индексом корзины в масиве к которому и будет привязана ссылка на целестный об*ект(пара(ключ и значение)).
Комментариев нет:
Отправить комментарий