zoukankan      html  css  js  c++  java
  • Java重写equals和hashCode方法

    在日常程序中,我们习惯使用equals方法来比较两个对象,继承自Object的equals方法默认的比较两个对象的内存地址(String类重写了equals方法,比较字符串的内容)。假如我们创建了两个Person对象,二者同名同姓,我们认为二者相同,但若是用equals方法比较二者,由于内存地址不同,返回的仍是false。因此我们需要重写equlas方法,以我们的视角来建立规则。我们以实例来分析:

    我们创建一个类并重写其equals方法,并创建两个对象person1和person2对象,然后比较二者。

    1.重写equals方法

    public class Person {
    	private String name;
    	private int age;
    	@Override
    	public boolean equals(Object obj) {
    		// TODO Auto-generated method stub
    		if (this == obj) {// 如果二者引用的为同一个对象,则返回true
    			return true;
    		}
    		if (obj == null) {// 如果比较的对象为null,返回false
    			return false;
    		}
    		if (obj.getClass() != this.getClass()) {
    			return false;//如果二者不是同一类对象,则返回false
    		}
    		Person person=(Person)obj;
    		if(person.getName().equals(getName())&&person.getAge()==getAge()){
    			return true;
    		}
    		return false;
    	}
     
    	public void setAge(int age) {
    		this.age = age;
    	}
     
    	public int getAge() {
    		return age;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    }
    

    通过测试,并将两个对象存放到HashSet之中,代码如下:

    public class TestDemo {
    	Set<Person> set=new HashSet<Person>();//定义一个HashSet存放person对象
    	@Test
    	public void test1(){
    		Person person1=new Person();
    		person1.setName("zhang");
    		person1.setAge(18);
    		Person person2=new Person();
    		person2.setName("zhang");
    		person2.setAge(18);
    		System.out.println("返回结果:"+person1.equals(person2));
    		set.add(person1);
    		set.add(person2);
    		System.out.println("set存在"+set.size()+"个对象
    "+set);
    	}
    }
    

    结果如下所示:

    返回结果:true
    set存在2个对象:[com.zhang.demo.Person@1ceebfa, com.zhang.demo.Person@1e6743e]

    此时我们发现一个问题,虽然通过重写equals方法判断两个对象相等,但二者都存入到了set之中。纳尼?众所周知,set中只能存入不同的对象,显然对于HashSet来说,仅仅重写equals方法是不够的(对于HashMap也一样),通过了解集合比较对象的原理,我们才知道,原来集合先比较两个对象的HashCode是否相等,若相等,则通过equlas方法比较,若两个方法都通过,则两个对象被视为同一个对象。接下来,我们再将hashCode方法重写。

    2.重写harshcode方法

    public int hashCode() {
    		// TODO Auto-generated method stub
    		int prime = 31;// 只要为素数就可以
    		int result = 1;
    		result=result*prime+(name==null?0:name.hashCode());
    		result=result*prime+age;
    		return result;
    	}
    

    然后在通过以上的测试方法测试,结果如下:

    返回结果:true
    set存在1个对象:[com.zhang.demo.Person@d6168d67]

    此时,HashSet之中只存入了一个对象。

  • 相关阅读:
    结对项目--四则运算“软件”之升级版
    个人项目--多元四则运算
    《构建之法》1-5章后感
    git bash的安装与配置
    随笔
    numpy数组及处理:效率对比
    完整的中英文词频统计
    组合数据类型,英文词频统计
    9.13作业2(完整温度转换、数字游戏、解析身份证号...)
    Mad Libs游戏,华氏与摄氏转换
  • 原文地址:https://www.cnblogs.com/JasonLGJnote/p/11965423.html
Copyright © 2011-2022 走看看