Змінюй хід війни! Допомагай ЗСУ!
  • Знижка на баннерну рекламу 30%! Банер на всіх сторінках сайту, в мобільній та десктопній версії за 14 тис. грн на місяць. Статистика сайту. Контакт: kharkovforum.com@gmail.com

[Java] Коллецкии, контейнер HashSet

  • Автор теми Автор теми beerofeel
  • Дата створення Дата створення
Статус: Офлайн
Реєстрація: 26.07.2010
Повідом.: 52
[Java] Коллецкии, контейнер HashSet

Ребята, приветствую.
Читаю сейчас Эккеля, подобрался к коллекциям. Есть множество Set, которое не хранит в себе одинаковые элементы.
Есть контейнер HashSet, которое имеет минимальное время выборки элементов, но их порядок будет хаотичным.

Следовательно, сам текст из книги:


Видно, что у автора итерация равна 10000 и вывод результата контейнера HashSet действительно выборка элементов находится в хаотичном порядке. При использовании контейнера TreeSet, можно было получить тот же самый результат, только отсортирован в порядке возрастания.

code:
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.


Однако, я набрал и запустил программу у себя в среде и получил результат:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 16, 19, 18, 21, 20, 23, 22, 25, 24, 27, 26, 29, 28]
Хаотичность, если её можно так назвать, только в конце последовательности.
Я использовал итератор, чтобы проследить каждое изменение в контейнере. Выборка практически сразу осуществляется сортировкой элементов.

Неужели, что-то поменялось с момента написания книги или я делаю неправильно что-то?

Спасибо.
 
Я слышал, что в quickSort джавы на некоторых наборах данных оно сортирует неправильно, но это не тот случай.

TreeSet - сортированная компаратором коллекция без повторений
HashSet - коллекция без повторений

JDK 1.6:
attachment.webp
 

Вкладення

  • .webp
    .webp
    34 КБ · Перегляди: 4082
Неужели, что-то поменялось с момента написания книги или я делаю неправильно что-то?

Возможно изменилась реализация hash алгоритма, поэтому у вас при обходе получились другие результаты, чем у автора книги. Но это не должно вас волновать - единственное, что важно, что при обходе hash таблицы нет никаких гарантий порядка элементов.

Например вы добавили e1, e2, e3, e4. У e1 и e3 оказалось одинаковое значения hash функции, при обходе эти два элемента будут скорее всего выведены друг за другом.

Почитайте как работает hash таблица вообще тут
 
Неужели, что-то поменялось с момента написания книги или я делаю неправильно что-то?

смотри в сорцы HashMap'ы станет все понятно. как получилось такое у автора, возможно это совсем вывод не HashSet'а. Для расстановкой точек над "и" смотри сорцы jdk которую использует автор и ты.
 
Спасибо, друзья. :)



Ребята, подскажите ещё одно. Читаю Экелля. В книге сказано, что List, Set Queue - это классы, но насколько я понял, это ведь интерфейсы?



Мда, открыл оригинал, прочитал. Нашим переводчикам руки поотрывать.

 
Останнє редагування:
А если включить межушный ганглий прежде чем писать херню?
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.
я не джава программист, привык что интерфейсы с буковкой I спереди и list является классом
P.S.: ну и если уже на то пошло интерфейс это класс



так что я прав в любом случае) стыдись же глупости своей
Banana.gif
 
Останнє редагування:
С другой стороны, у объекта "интерфейс" есть свой объект "Class" в загрузчике классов jre, и массив int[] это тоже класс.
 
Интерфейс лишь указывает компилятору какой функционал обязан содержать класс который этот интерфейс реализует, не больше не меньше. Интерфейс это один из инструментов программиста для построения объектной модели своего приложения, чтобы не дать построить объект без какого либо критически важного поведения запланированного в начале всей иерархии наследования. Он не является сущностью как класс, если класс это шаблон тела и поведения объекта, то интерфейс это строгий шаблон шаблона поведения объекта не реализовав который приложение просто не построится.
 
Интерфейс лишь указывает компилятору какой функционал обязан содержать класс который этот интерфейс реализует, не больше не меньше. Интерфейс это один из инструментов программиста для построения объектной модели своего приложения, чтобы не дать построить объект без какого либо критически важного поведения запланированного в начале всей иерархии наследования. Он не является сущностью как класс, если класс это шаблон тела и поведения объекта, то интерфейс это строгий шаблон шаблона поведения объекта не реализовав который приложение просто не построится.

это один пункт для чего используют интерфейсы, но это не отменяет того факта что интерфейс это класс :)
 
дабы не плодить тролля пруфдлинк в студию, только не на авторские книжки, а на документ, что "интерфейс является классом". Я наверно чтото пропустил в изучении.
 
ну, например в википедии написано что интерфейс == абстрактный класс, в книжках обычно не пишут такого, ровно как и обратного, потому что цель в них научить нулевого хоть чему-то, и если смешать все в кучу, то обучение будет незачетное

https://ru.wikipedia.org/wiki/Интерфейс_(объектно-ориентированное_программирование)
 
P.S.: ну и если уже на то пошло интерфейс это класс
"Это просто праздник какой-то!"(ТМ)
Праздник глупости и ослиного упорства.
В документации пишут "интерфейс" - но находятся клоуны, которые говорят "неее, это класс"...

ну, например в википедии написано что интерфейс == абстрактный класс, в книжках обычно не пишут такого, ровно как и обратного, потому что цель в них научить нулевого хоть чему-то, и если смешать все в кучу, то обучение будет незачетное
Если бы ты потрудился прочесть внимательно хотя бы первую фразу по своей ссылке - то заметил бы слова "с точки зрения РЕАЛИЗАЦИИ".
 
пруфдлинк в студию (с)

в моем написано что интерфейс - это класс и ни разу, хоть и с точки зрения реализации, другой точки зрения там нет
 
дабы не плодить тролля пруфдлинк в студию, только не на авторские книжки, а на документ, что "интерфейс является классом". Я наверно чтото пропустил в изучении.
Это какие "не авторские книжки" Вы хотите увидеть? Библию или ветхозаветные скрижали с десятью заповедями? Все остальные документы, книги, статьи etc. всегда имеют конкретных авторов. Всё, что касается принципов работы вычислительной техники, было не "дано свыше", а придумано конкретными людьми. Начиная от архитектуры Фон-Неймана. И что характерно, многие из них свои мысли в "авторских книжках" зафиксировали. Если всегда докапываться "а где это прописано", можно далеко зайти. Это форум, а не защита диплома.

ну, например в википедии написано что интерфейс == абстрактный класс, (...)
В том же C# интерфейс это не абстрактный класс, так как интерфейс там есть декларация обязательных членов без реализации, а абстрактный класс может предусматривать как декларацию методов без реализации (абстрактных методов), так и методов с реализацией по умолчанию (виртуальных методов). Назначение ключевого слова "abstract" в декларации класса просто служит для запрета создания его экземпляров.

P.S. Корректнее использовать символ <=> ("эквивалентно") для утверждений из первой строки. Он математический и международный. А символ == многими программистами языков семейства С привычно читается "равно ли".

Праздник глупости и ослиного упорства.
В документации пишут "интерфейс" - но находятся клоуны, которые говорят "неее, это класс"...
Держите себя в руках. Большинство абстрактных концепций, придуманных человеком, не может быть однозначно выражено таким способом, чтобы у всех людей сложилось идентичное представление. Конечно, со своим уставом в чужой монастырь не ходят и тема явно про Java. Однако полезно иногда взглянуть на мир под другим углом. В базовой концепции ООП нет понятия "интерфейс" (сравнивая все языки, признанные объектно-ориентирвоанными, обнаружите, что понятие класса есть везде, а конкретное понятие интерфейса - далеко не везде). Однако это не мешает всем программистам понимать в какой-то мере эту концепцию и реализовывать даже без ключевого слова "interface". Как призывает Дж. Макконнелл, "программируйте с использованием языка, а не на языке". Есть в Java своё определение концепции интерфейсов? Чудесно! Но это не мешает взглянуть на интерфейсы как на классы.
 
Останнє редагування:
давайте уже и хедеры назовем классами :рл:
Пардон, Вы про какие хедеры? Файлы, которые содержат декларацию классов без описания реализации методов? Или нечто узкоспециальное из Java?
 
Назад
Зверху Знизу