Страницы

Поиск по вопросам

суббота, 28 декабря 2019 г.

Сортирует ли примитивы коллекции HashSet()?

#java #хеширование #коллекции


import java.util.HashSet;
import java.util.Set;

public class Main2 {
    public static void main(String[] args) {
        Set intset = 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, а это значение и будет индексом корзины в масиве к которому и будет привязана ссылка на целестный об*ект(пара(ключ и значение)).

Комментариев нет:

Отправить комментарий