Object 为什么HashSet存储整数值本身,而HashSet存储Demo对象的引用?

Object 为什么HashSet存储整数值本身,而HashSet存储Demo对象的引用?,object,collections,set,wrapper,hashset,Object,Collections,Set,Wrapper,Hashset,大家好 输出:[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<

大家好

输出:[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]

其中,尽管Integer是一个类包装器类,i1、i2是它的对象,但这段代码还是打印值本身

我想知道为什么会发生这种情况,或者为什么会存在这种差异

谢谢,, Suthan

哈希集和哈希集都存储对对象的引用

System.out.printlnset打印set.toString方法返回的字符串。此方法为集合中的每个对象调用object.toString,并用空格连接它们


现在,由于Integer.toString以字符串形式返回实际值,因此可以看到Integer打印的值,而在演示中,Demo.toString以字符串形式返回对象引用,因为它是默认方法。您可以在演示中重写此方法,以字符串形式返回实际值。

是的,确实如此。但是当我更改Integer.i2的值时,假设i2=30并尝试执行set.remove2,它不会从集合中删除任何项,集合的大小仍然是2。其中,当我对demo.d2执行相同操作时,先前为d2的项将被删除,集合的大小将变为1。整数是原始int类型的整数。当执行i2=30时,请考虑创建一个值为30的新整数对象,并将其指定给i2。现在,这个i2与集合中的i2不同了。@shriramesh“当我对demo.d2做同样的事情时”是什么意思?做同样的事情意味着做一项作业。除冗余d2=d2外,任何分配都将表现出与i2=30相同的行为;removed2不会删除旧的对象引用。@Holger,对不起,我的意思是对Demo.d2.a执行相同的操作,因为d2.a=30。但是,它不一样。分配一个引用变量与分配一个被引用对象的字段是完全不同的。
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);
    }
}