Почему HashSet <Integer>хранит само целочисленное значение, а HashSet <Demo>сохраняет ссылку на объект Demo? - PullRequest
0 голосов
/ 20 июня 2020

Привет всем,

class Demo{
    private int a;
    Demo(int a){
        this.a = a;
    }
}

public class Test{
    public static void main(String[] args){
        
        Demo d1 = new Demo(10);
        Demo d2 = new Demo(20);
        
        Set<Demo> set = new HashSet<Demo>();
        
        set.add(d1);
        set.add(d2);
        
        System.out.println(set);
    }
}

Вывод : [javaSE_8. Demo@15db9742, javaSE_8. Demo@6d06d69c]

Я понимаю что приведенный выше код печатает ссылку на объект.

public class Test{
    public static void main(String[] args){
        
        Integer i1 = 10;
        Integer i2 = 20;
        
        Set<Integer> set = new HashSet<Integer>();
        
        set.add(i1);
        set.add(i2);
        
        System.out.println(set);
    }
}

Вывод : [20, 10]

Где, поскольку этот код печатает само значение, несмотря на Целое число - это класс (класс Wrapper) и i1, i2 - его объекты.

Я хочу знать, почему это происходит или почему существует эта разница.

Спасибо, Сутан

1 Ответ

1 голос
/ 20 июня 2020

И HashSet<Demo>, и HashSet<Integer> хранят ссылки на объект.

System.out.println(set) печатает String, возвращенное методом set.toString(). Этот метод вызывает object.toString() для каждого object в наборе и объединяет их с пробелом.

Теперь, поскольку Integer.toString() возвращает фактическое значение как String, вы видите, что значение печатается для Integer, тогда как в случае Demo, Demo.toString() возвращает ссылку на объект как String, поскольку это метод по умолчанию java.lang.Object.toString(). Вы можете переопределить этот метод в Demo, чтобы вернуть фактическое значение как String.

...