Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Java > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 20.06.2018, 11:36   #11
Alexmur07
Форумчанин
 
Регистрация: 20.11.2008
Адрес: Новосибирская область
Сообщений: 113
Репутация: 10
По умолчанию

я как раз про это и говорил, почему про побитовый сдвиг не расписано нигде?
__________________
Разгон – вещь не определённая,
по этому конечный результат зависит от конкретного чипа (CPU или GPU а также моста), качества охлаждения и везения.
Alexmur07 вне форума   Ответить с цитированием
Старый 20.06.2018, 11:38   #12
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 12,482
Репутация: 2073
По умолчанию

Цитата:
Сообщение от Alexmur07 Посмотреть сообщение
мы тут проверяем если кей равену нулл то вернуть 0 если кей не равен нулл то h = key.hashCode() или h побитовый сдвиг на 16
Еще раз - нет. Нет там или. Если не нулл мы h = key.hashCode(), делаем сдвиг и ксорим два числа между собой

Цитата:
я как раз про это и говорил, почему про побитовый сдвиг не расписано нигде?
Потому что хэш вы можете вычислять как хотите. В практике, естественно, накладываются доп. ограничения типа быстрой вычислимости и уменьшения коллизий.
__________________
Запомните раз и навсегда: помочь != "решите за меня"!

Последний раз редактировалось p51x; 20.06.2018 в 11:40.
p51x вне форума   Ответить с цитированием
Старый 20.06.2018, 19:34   #13
Alexmur07
Форумчанин
 
Регистрация: 20.11.2008
Адрес: Новосибирская область
Сообщений: 113
Репутация: 10
По умолчанию

понял, т.е. этот метод сокращает количество коллизий, к примеру если хешкод объекта равен 2338892 в двоичной системе получается *001000111011000001001100‬ сдвигаем биты вправо на 16 разрядов , получаем 00100011 переводим в десятичную систему счисления, получается 35 , далее идёт условие 2338892 ^ 35 получается 2338927 - т.е. сократили количество коллизий, теперь подскажите мне ксор это у нас плюс чтоли??? или как работает этот ксор в нашем случае? и второй вопрос: как называется тогда метод который вычисляет индекс в хешмапе indexFor - этот метод я почему то в хешмап не нашёл, хотя во многих источниках в хешмап указывается именно этот метод
__________________
Разгон – вещь не определённая,
по этому конечный результат зависит от конкретного чипа (CPU или GPU а также моста), качества охлаждения и везения.
Alexmur07 вне форума   Ответить с цитированием
Старый 20.06.2018, 19:44   #14
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 17,117
Репутация: 3316

icq: 512-765
skype: alexp.frl
По умолчанию

Цитата:
Сообщение от Alexmur07 Посмотреть сообщение
как работает этот ксор в нашем случае?
так же как и во всех других.
Alex11223 вне форума   Ответить с цитированием
Старый 20.06.2018, 20:22   #15
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 12,482
Репутация: 2073
По умолчанию

Цитата:
Сообщение от Alexmur07 Посмотреть сообщение
или как работает этот ксор в нашем случае?
https://en.wikipedia.org/wiki/Exclusive_or
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x вне форума   Ответить с цитированием
Старый 20.06.2018, 22:12   #16
Alexmur07
Форумчанин
 
Регистрация: 20.11.2008
Адрес: Новосибирская область
Сообщений: 113
Репутация: 10
По умолчанию

туплю, всё, с этим понятно, а какой тогда метод в хешмап будет отвечать за вычисление индекса?
__________________
Разгон – вещь не определённая,
по этому конечный результат зависит от конкретного чипа (CPU или GPU а также моста), качества охлаждения и везения.
Alexmur07 вне форума   Ответить с цитированием
Старый 20.06.2018, 22:18   #17
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 17,117
Репутация: 3316

icq: 512-765
skype: alexp.frl
По умолчанию

В смысле какой? Он не нужен вам снаружи (и вообще мало ли как там оно реализовано), поэтому и метод такой вряд ли предоставили.
Если интересно как внутри — смотрите исходники JDK.
Alex11223 вне форума   Ответить с цитированием
Старый 20.06.2018, 22:27   #18
Alexmur07
Форумчанин
 
Регистрация: 20.11.2008
Адрес: Новосибирская область
Сообщений: 113
Репутация: 10
По умолчанию

не понимаю, т.е. везде приводят пример вычисления индекса с помощью хешкод% длина внутреннего массива, а про настоящую реализацию нигде и никто не рассказывает?
__________________
Разгон – вещь не определённая,
по этому конечный результат зависит от конкретного чипа (CPU или GPU а также моста), качества охлаждения и везения.
Alexmur07 вне форума   Ответить с цитированием
Старый 20.06.2018, 22:29   #19
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 17,117
Репутация: 3316

icq: 512-765
skype: alexp.frl
По умолчанию

Где везде?
Ну так если нужна настоящая реализация вашего HashMap, то ее и смотрите в исходниках вашего JDK.
Alex11223 вне форума   Ответить с цитированием
Старый 20.06.2018, 22:39   #20
Alexmur07
Форумчанин
 
Регистрация: 20.11.2008
Адрес: Новосибирская область
Сообщений: 113
Репутация: 10
По умолчанию

да в гугл вбить если как вычисляется индекс в хешмап - то он и выдаёт в соновном это
и ещё выдаёт что индекс вычисляется с помощью метода indexFor
Цитата:
*/ public V put(K key, V value) { if (key == null) return putForNullKey(value); int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); for (Entry e = table[i]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; addEntry(hash, key, value, i); return null; }

, вот только когда лезишь в релизацию hashMap то видишь совсем другое:
Код:

public V put(K key, V value) {
        return putVal(hash(key), key, value, false, true);
    }

 final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
                   boolean evict) {
        Node<K,V>[] tab; Node<K,V> p; int n, i;
        if ((tab = table) == null || (n = tab.length) == 0)
            n = (tab = resize()).length;
        if ((p = tab[i = (n - 1) & hash]) == null)
            tab[i] = newNode(hash, key, value, null);
        else {
            Node<K,V> e; K k;
            if (p.hash == hash &&
                ((k = p.key) == key || (key != null && key.equals(k))))
                e = p;
            else if (p instanceof TreeNode)
                e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
            else {
                for (int binCount = 0; ; ++binCount) {
                    if ((e = p.next) == null) {
                        p.next = newNode(hash, key, value, null);
                        if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
                            treeifyBin(tab, hash);
                        break;
                    }
                    if (e.hash == hash &&
                        ((k = e.key) == key || (key != null && key.equals(k))))
                        break;
                    p = e;
                }
            }
            if (e != null) { // existing mapping for key
                V oldValue = e.value;
                if (!onlyIfAbsent || oldValue == null)
                    e.value = value;
                afterNodeAccess(e);
                return oldValue;
            }
        }
        ++modCount;
        if (++size > threshold)
            resize();
        afterNodeInsertion(evict);
        return null;
    }

и вот тут я честно не понимаю какой метод отвечает за вычисление индекса
__________________
Разгон – вещь не определённая,
по этому конечный результат зависит от конкретного чипа (CPU или GPU а также моста), качества охлаждения и везения.
Alexmur07 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Достать значения JSON из HashMap yura91 Java Мобильная разработка (Android) 2 09.07.2016 20:25
Java и HashMap OlgaLenc Помощь студентам 0 10.12.2014 14:44
Работа с HashMap<> (java) 803 Помощь студентам 0 23.12.2013 19:29
Hashmap Артем533 Общие вопросы по Java, Java SE, Kotlin 2 25.11.2012 00:17


08:20.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru