A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

   HashSet存储的元素不能重复,判断两个元素是否是同一个元素是比较两者的HashCode,每个对象都有自己的HashCode。在程序中可以覆盖对象的int hashCode()方法。

class Person{
        public String name;
        public int age;
        public Person(String name,int age){
                this.name=name;
                this.age=age;
        }
        public int hashCode(){
                return age;
        }
}
class reflectdemo{
        public static void main(String[] args){
                Person p1=new Person("p1",21);
                Person p2=new Person("p2",22);
                Person p3=new Person("p3",23);
                Person p4=new Person("p4",24);
                HashSet<Person> hs=new HashSet<Person>();
                hs.add(p1);
                hs.add(p2);
                hs.add(p3);
                hs.add(p4);
                System.out.println(hs.size());
                p4.age=25;
                System.out.println(hs.remove(p4));
                System.out.println(hs.size());
        }
}  

上面的代码中,将Person类的hasCode()方法覆盖,用age值作为对象的HashCode值,在往hs中添加对象时,因为每个Person对象的age都不一样,HashCode也不一样,所以都能添加进来,hs.size()=4。当p4修改了字段age值,它的HashCode值也随之改变,当调用hs.remove(p4)时,将比较hs中每个元素的HashCode值,结果没有HashCode值是25的元素,删除失败,p4仍然在容器中。如果程序中反复修改对象字段值,并添加到容器中,容器比较HashCode值后都会接收,造成内存泄露。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马