【Java SE】比较器和克隆

本文详细介绍了Java中如何实现比较器,包括实现Comparable接口和Comparator接口,并通过实例解析了比较器的用法。同时,文章还探讨了Java中的克隆,包括浅拷贝和深拷贝的概念及实现,解释了实现Cloneable接口的重要性,以及浅拷贝与深拷贝的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.比较器

1.1 实现comparable接口

1.2 实现Comparator接口

2.实现克隆Cloneable接口

2.1 浅拷贝

2.2 深拷贝


1.比较器

在Java中,说到引用类型之间的比较,我们不能使用基本的数据类型比较的方法,比如==、!=等

所以就有现在的比较器,来比较引用对象内部某个成员的大小

1.1 实现comparable接口

把将要比较的类实现comparable接口,重写compareTo方法

然后在重写的compareTo方法中实现你想比较对象成员

下面实现一个Student类,比较age的比较器

class Student implements Comparable<Student>{
public String name;
public int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public int compareTo(Student o) {
        //return this.name.compareTo(o.name);比较年龄
        return this.age-o.age;
    }
}
class Money implements Cloneable{
    public double money=19.99;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
public class TestDemo{
    public static void main(String[] args) throws CloneNotSupportedException {
        Student student1=new Student("bit",14);
        Student student2=new Student("abc",15);
        if(student1.compareTo(student2)>0)){
            System.out.println("student1>student2");
        }else{
            System.out.println("student1<=student2");
        }
    }
}

当然这个代码也能实现name的比较,只需要将

   return this.age-o.age;

换成

return this.name.compareTo(o.name);

但是问题是如果既想实现age的比较的同时,实现这个年龄的比较怎么办呢?

再次实现一个类?显然是变得麻烦一些,所以就有了后面的Comparator比较器

1.2 实现Comparator接口

实现自己的比较器

comparator接口的比较器的优点就是可以同时实现nameComparator和ageComparator

在比较age和name时,首先创建相应的类对象,调用重写的compare方法即可

class NameComparator implements Comparator<Student> {

    @Override
    public int compare(Student o1, Student o2) {
        return o1.name.compareTo(o2.name);
    }
}
class  AgeComparator implements Comparator<Student>{
    @Override
    public int compare(Student o1, Student o2) {
        return o1.age-o2.age;
    }
}

2.实现克隆Cloneable接口

在Java中支持克隆接口,所谓克隆就是将某个对象

首先需要了解一下,拷贝与克隆的区别

对于一个引用类型来所,拷贝其实两者公用的还是同一个对象,也就是所,当改变某个对象的值,另一个也发生了改变

克隆就是,在原有对象的基础上,创建出一个新的对象,有自己新的地址,只不过这两个对象中的成员值时相等的,改变某个对象的内部的值,对另一个对象不会产生影响

要实现克隆,离不开cloneable接口

在这个cloneable接口中,没有具体的方法,但是不意味着,不需要cloneable接口,如果不实现这个接口,程序就会出现异常

克隆一个person对象

class Person implements Cloneable{
    public int age=19;
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();//父类Object中的方法clone,通过c语言实现
    }
}
public class TestDemo{
   public static void main(String[] args) throws CloneNotSupportedException {
    Person person1=new Person();//通过person1克隆出person2
    Person person2=(Person)person1.clone();
   }

2.1 浅拷贝

当存在一个的类时,而这个类里存在一个引用对象

所谓浅拷贝,就是虽然将这个对象实现了拷贝,但是这个对象中的m引用的对象没有实现克隆,也就是他们共用了同一个Money对象,通过m创建的是同一个对象,地址也相等

当改变m对象中的money的值时,这两个Person创建的对象内部同时发生了改变

2.2 深拷贝

所谓深拷贝,其实跟浅拷贝差不多,无非就是在原有的基础上,对m对象也实现了克隆

这样改变某个m对象的值,另一个m创建的对象中的money值不发生改变

这两个对象的地址也不相等

class Person implements Cloneable{
    public int age=19;
    public Money m=new Money();
    @Override
    protected Object clone() throws CloneNotSupportedException {
        Person temp=(Person)super.clone();
        temp.m=(Money) this.m.clone();  //修改引用类型的值
        return temp;
        //return super.clone();//父类的clone 看不见
    }
}
public class TestDemo{
    public static void main(String[] args) throws CloneNotSupportedException {
        Person person1=new Person();
        Person person2=(Person)person1.clone();
        System.out.println(person1.m.money);
        System.out.println(person2.m.money);
        person2.m.money=99;
        System.out.println(person1.m.money);
        System.out.println(person2.m.money);
    }
}

评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值