Java 中 equals,CompareTo,Comparator 之间的区别 以及 clone

1.equals

  • 用来比较两个对象的内容
  • 返回值是boolean
 public static void main(String[] args) {
        People[] people = new People[2];
        people[0] = new People("zk",19);
        people[1] = new People("zk",19);
        System.out.println(people[0].equals(people[1]));

    }

 调用时需要重写equals方法

    public boolean equals(Object obj) {
        People tmp = (People) obj;
        return this.name.equals(tmp.name)
                &&this.age == tmp.age;
    }

如果两个对象的内容相同则会返回true 

2.CompareTo

通过接口实现,同样的调用时需要重写compareTo方法,值得一提的是Arrays.sort()方法可以通过调用compareTo来实现排序

   public static void main(String[] args) {
        People[] people = new People[2];
        people[0] = new People("zk",19);
        people[1] = new People("river",20);

        System.out.println("排序前:"+Arrays.toString(people));
        Arrays.sort(people);
        System.out.println("排序后:"+Arrays.toString(people));
    }
}
    public int compareTo(People o) {
        return this.age - o.age;
    }

    @Override
    public String toString() {
        return "People{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

 但是作用单一,如果要以不同的方式排序需要自己修改

这时候的解决方案就是使用Comparetor接口

3.Comparator

与之相同的由接口实现,但是Arrays.sort()调用的时候需要输入两个参数,因此它能够实现按自己的想法来排序

创建类实现接口,<>里要比较什么放什么,在选择以什么排序时,创建对应类的对象之后作为Arrays.sort 的参数

 public static void main(String[] args) {
        People[] people = new People[2];
        people[0] = new People("zk",19);
        people[1] = new People("river",20);

        namePeople o1 = new namePeople();
        agePeople o2 = new agePeople();
        System.out.println("以name来排");
        Arrays.sort(people,o1);
        System.out.println(Arrays.toString(people));
        System.out.println("以age来排");
        Arrays.sort(people,o2);
        System.out.println(Arrays.toString(people));
    }
public class namePeople implements Comparator<People> {
    @Override
    public int compare(People o1, People o2) {
        return o1.name.compareTo(o2.name);
    }

}
public class agePeople implements Comparator<People> {
    @Override
    public int compare(People o1, People o2) {
        return o1.age - o2.age;
    }
}

name来排序就是按照字母的ASCLL码值来进行比较

 总结:

equals用来直接比较内容,compareTocomparator通过接口实现,但是compareTo只能单一比较,comparator可以实现多个接口多个比较

4.clone

4.1什么是克隆

用克隆方法对一个对象进行克隆,这就是克隆

在方法内部重写克隆方法,此时可以使用克隆方法,但还是会报错 

这是因为方法返回值是Object,需要向下转型为people

对类实现克隆接口,可是点击克隆方法一看什么也没有,因为这个接口的存在意义就是允许这个类实现克隆

 

但是仍旧报错 

 最后抛出异常,直接在main方法之后补上这句话就可以解决

4.2浅拷贝和深拷贝

people类里再创建一个Money类,然后打印出来

在这里可以看到修改po1的值,而打印的值相同,这说明popo1使用的是相同的

这就是浅拷贝 ,没有克隆Money

 

这里用一张图片来表示

而要实现深拷贝,就需要给Money类也实现克隆接口,并重写克隆方法

再把people类的克隆方法修改一下

 这里用一张图片来表示

 此时打印的结果就是深拷贝之后的

总结:

  • 克隆需要使用克隆方法
  • 类要重写克隆方法
  • 实现克隆接口
  • 解决抛出异常的问题
  • 自定义类型要想完成克隆就必须向下转型
  • 如果要实现深拷贝则把要深拷贝的类也实现克隆
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值