Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

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

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

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

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

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

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

Цитата:
Сообщение от Alexmur07 Посмотреть сообщение
как работает этот ксор в нашем случае?
так же как и во всех других.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 20.06.2018, 19:22   #15
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от Alexmur07 Посмотреть сообщение
или как работает этот ксор в нашем случае?
https://en.wikipedia.org/wiki/Exclusive_or
p51x вне форума Ответить с цитированием
Старый 20.06.2018, 21:12   #16
Alexmur07
Форумчанин
 
Регистрация: 20.11.2008
Сообщений: 121
По умолчанию

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

В смысле какой? Он не нужен вам снаружи (и вообще мало ли как там оно реализовано), поэтому и метод такой вряд ли предоставили.
Если интересно как внутри — смотрите исходники JDK.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 20.06.2018, 21:27   #18
Alexmur07
Форумчанин
 
Регистрация: 20.11.2008
Сообщений: 121
По умолчанию

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

Где везде?
Ну так если нужна настоящая реализация вашего HashMap, то ее и смотрите в исходниках вашего JDK.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 20.06.2018, 21:39   #20
Alexmur07
Форумчанин
 
Регистрация: 20.11.2008
Сообщений: 121
По умолчанию

да в гугл вбить если как вычисляется индекс в хешмап - то он и выдаёт в соновном это
и ещё выдаёт что индекс вычисляется с помощью метода 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 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


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