Re[7]: Java Interop - один и тот же код возвращает разные зн
От: GarryIV  
Дата: 26.03.25 19:05
Оценка:
Здравствуйте, Кодт, Вы писали:

GIV>>если хеш код не меняется то и порядок будет одинаковый


К>Тогда почему в исходном посте мы наблюдаем дребезг? Что является источником шума?


Условие если хеш код не меняется. Если алгоритм хеша использует адрес объекта, рандом — что угодно что меняется от запуска к запуску то порядок может менятся.


Вот небольшой пример (тут HashSet но он внутри тот же HashMap):
class Main {

    static class Test1 {
        static final java.util.Random r = new java.util.Random();
        final int val; 
        final int hash = r.nextInt();

        public Test1(int v) {
            this.val = v;
        }
        
        public String toString() {
            return String.valueOf(val);
        }
        
        public int hashCode() {
            return hash;
        }
    }
    
    static class Test2 {
        final int val; 

        public Test2(int v) {
            this.val = v;
        }
        
        public String toString() {
            return String.valueOf(val);
        }
        
        public int hashCode() {
            return val;
        }
    }
    
    public static void main(String[] args) {
        var s1 = new java.util.HashSet<Test1>();
        s1.add(new Test1(1));
        s1.add(new Test1(2));
        s1.add(new Test1(3));
        
        var s2 = new java.util.HashSet<Test2>();
        s2.add(new Test2(1));
        s2.add(new Test2(2));
        s2.add(new Test2(3));
        
        System.out.println(s1); // порядок меняется так как меняются хеши
        System.out.println(s2); // порядок стабильный так как хеши не меняются
    }
}

потыкать тут https://www.programiz.com/online-compiler/3iJdnEiLfPdE5

PS: писал в браузере и equals не реализовывал ибо влом, желающие могут реализовать и убедиться что особо не влияет
WBR, Igor Evgrafov
Отредактировано 26.03.2025 19:09 GarryIV . Предыдущая версия . Еще …
Отредактировано 26.03.2025 19:07 GarryIV . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.