equals使用和重写

来源:互联网 发布:kettle java代码 编辑:程序博客网 时间:2024/06/11 08:43

equals用于比较两个对象是否是相同的,基本类型是比较值,引用类型是比较的地址.
但有时我们需要比较两个类是否是相同的,比较的是某些属性的值,这就要涉及到重写.
先创建一个People类
重写里面的hashCode和equals方法

public class People {    private String name;    private int age;    public People() {        super();    }    public People(String name, int age) {        super();        this.name = name;        this.age = age;    }    @Override    public String toString() {        return "People [name=" + name + ", age=" + age + "]";    }    // 系统自动生成的对象的唯一编号    // 1. equals 相等的两个对象hashCode必须一致    // 系统为了提高效率,HashSet等判断两个相等的时候,会先比较hashCode    // 如果一致,调用equals进行比较,如果不一致,那就认为不相同    // 重写equals方法,必须重写hashCode保证值相等对象,hashCode也相等    // 2.hashCode 相等的equals不一定相等    @Override    public int hashCode() {        final int prime = 31;        int result = 1;        result = prime * result + age;        result = prime * result + ((name == null) ? 0 : name.hashCode());        return result;    }    @Override    public boolean equals(Object obj) {        if (this == obj) // 同一个对象进行比较肯定是相同的            return true; // 如果没有{}那么只有紧跟着if的下行一行代码在if判断内        if (obj == null) // 如果参数为空 肯定不相等            return false;        if (!(obj instanceof People)) // instance 实例化,创建对象            return false; // instanceof 判断是否是某个类的对象                          // 判断obj是否是People或其子类的对象                          // true是  false不是        // 排除所有错误的情况 进行值的比较        People other = (People) obj;        // obj的编译时类型是object 决定我们写代码时能够调用哪些属性和方法        // 调用不了People类的name和age属性        // 通过强制转换,把编译时类型改为People,就可以调用People的属性和方法了        // 比较两个对象属性的值,是否相等        if (age != other.age)            return false;        if (name == null) { // 如果name == null 调用equals方法会产生空指针异常            if (other.name != null) // 一个为null,另一个不为null                return false;        } else if (!name.equals(other.name)) // 取反,不相等的时候返回false            return false;        return true; // 如果能够执行到这里,说明age和name相同    }}

再创建一个Test类

import java.util.ArrayList;import java.util.HashSet;public class Test {    public static void main(String[] args) {        HashSet<String> hs1 = new HashSet<String>();        hs1.add("ABC");        hs1.add("ABC");        // HashSet 相同的元素只会添加一个,靠的是hashCode和equals方法        // 引用类型==比较的是地址,equals 默认比较的是地址        // 可以重写equals方法实现值的比较,比如String        People p1 = new People("张三",20);        People p2 = new People("张三",20);        System.out.println("p1==p2"+(p1==p2));        System.out.println("p1.equals(p2)"+(p1.equals(p2)));        HashSet<People> hs2 = new HashSet<People>();        hs2.add(p1);        hs2.add(p2);        // HashSet使用equals进行对象的比较        // 如果相同就认为是同一个对象,不再加入到Set中        for (People people : hs2) {            System.out.println(hs2);        }        ArrayList<People> al1 = new ArrayList<People>();        al1.add(p1);        // contains 也是比较值,不是比较地址        System.out.println("al1.contains(p2)" + al1.contains(p2));        // such that (o==null)?e==null:o.equals(e))        // o 为参数  e 数组中的每一个元素        // 如果参数为null  判断e 是否为null,为null返回true        // 如果参数不为null,判断o和e的值是否相等        // 进行值的比较,contains其实就是return indexOf(o)>= 0;        // 找到返回索引 找不到返回-1        System.out.println("元素在数组中的索引:" + al1.indexOf(p2));    }}

equals方法可以根据我们的需要进行修改,以实现我们想要的比较功能.

原创粉丝点击