equal、hashCode、comparator和comparable接口

1 重写equals方法 为什么需要重写hashCode

o1 euqal o2,但是hashCode不同,那么以map中put方法为例:
先hashCode,后equal,hashCode不同,那么不会放到同一个链表中,所以两个对象都能放到map中,但是两个对象可能equals,这就出现了map中key相同的问题
所以Java对于eqauls方法和hashCode方法是这样规定的: 
如果两个对象equal,那么它们的hashCode值一定要相同。

public class DashboardBoard implements Serializable {

    private String boardName;

    public String getBoardName() {
        return boardName;
    }



    public void setBoardName(String name) {
        this.boardName = name;
    }



    @Override
    public boolean equals(Object o){
        if(o == null){
            return false;
        }
        if(o.getClass() != this.getClass()){
            return false;
        }
        DashboardBoard b = (DashboardBoard)o;
        if(b.getBoardName() != null && (b.getBoardName().equals(this.getBoardName()))){
            return true;
        }
        return false;
    }


    @Override
    public int hashCode(){
        if(null == this.getBoardName()){
            return 0;
        }
        return this.getBoardName().hashCode();
    }
}

equal方法

1) 判空,空直接返回false
2) 判class ==,不等返回false
3)属性比较
4)一定重写hashCode方法

2 对象比较

comparable compareTo(T) 接口,自然排序
comparator compare(T1,T2) 类,定制排序
有个不成名规定compare(T1,T2),如果T1>T2,那么compare的结果应该为正,可以理解为减的关系
https://blog.csdn.net/u011240877/article/details/53399019

public class User implements Comparable {

    int age ;
    int num;

    public static void main(String[] args) {

        // 采取实现Comparable方式,重写compareTo方法
        TreeSet<User> users = new TreeSet<>();
        users.add(new User(12));
        users.add(new User(10));
        users.add(new User(14));
        for(User user : users){
            System.out.println(user.getAge());
        }

        // 采取Comparator方式,此时以comparator为准
        TreeSet<User> users1 = new TreeSet<>((o1, o2) -> o1.getNum()-o2.getNum());
//        TreeSet<User> users1 = new TreeSet<>(new Comparator<User>() {
//            @Override
//            public int compare(User o1, User o2) {
//                return o1.getNum()-o2.getNum();
//            }
//        });
        users1.add(new User(12,11));
        users1.add(new User(10,12));
        users1.add(new User(14,13));
        for(User user : users1){
            System.out.println(user);
        }
    }
    public User(int age){
        this.age = age;
    }

    public User(int age, int num){
        this.age = age;
        this.num = num;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public int compareTo(Object o) {
        if(o instanceof  User){
            return this.getAge()-((User) o).getAge();
        }
        return 0;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值