hashSet的原理是 首先调用对象的hashCode 方法得出hashCode值, 若值不相等,则直接加入hashSet,如果相等,在调用对象的equals方法,判断,如果相等,则舍弃,否则加入。
所以 先实现Person类的 hashCode方法 和 equals 方法 ,否则加入的对象 会调用 Object类的方法,这样实现的Set就不是准确的
集合类里面,比较2个对象是否相等,使用的是对象提供的equals方法,如果你的Person类没有重写这个方法的话,就会使用默认的父类Object的实现,可以认为比较的就是2个对象的内存地址。
你每次new操作都是在堆内存里新开辟一段区域来增加对象,所以内存地址肯定是不一样的。
当然你这个把对象放入hash类的集合,还需要实现hashcode方法,而且要按照一定的原则来实现,可以网上找找资料。
你进行两次new Person("fdd",45),其实在堆内存中,这是两个不同的对象(匿名对象)。另外你可以这样试验下:Person p = new Person("fdd",45);然后你进行hs.add(p);两次,看下效果。
创建对象使用new。new过了,虽然像你这样new Person("fdd",45),但是这个两个对象,拥有不同的地址,是不一样的
这种可以:
Person p1 = new Person("fdd",45);
Person p2 = p1;
hs.add(p1);
hs.add(p2);
你试试吧
new Person后是两个不同的实例啊。你override equals方法先。