首页 > 其他分享 >比较器,深拷贝,浅拷贝

比较器,深拷贝,浅拷贝

时间:2024-09-24 12:51:01浏览次数:16  
标签:name age public Student new 拷贝 比较 String

Comparable接口

我们写一个Student类,方便以下讲解

public class Student {
    public String name;
    public int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

当我们想要去比较我们自己定义的类时,发现我们无法去进行。因为他自能比较基本数据类型。

  public static void main(String[] args) {
        Student student1 = new Student("张三",20);
        Student student2 = new Student("李四",21);
        System.out.println(student1 > student2);
  }

单比较

如果我们想要比较我们自己定义的类时,那我们就要实现Comparable接口,并且重写compareTo方法。

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

    @Override
    public int compareTo(Student o) {
        return this.age - o.age;
    }
}

然后再通过main函数去调用compareTo方法来比较。

public static void main(String[] args) {
        Student student1 = new Student("张三",20);
        Student student2 = new Student("李四",21);
        System.out.println(student1.compareTo(student2));
}    

我们发现他只能单个比较,那我们想要多个比较该怎么办呢?

多比较

我们只需要把这些对象放到一个数组里,因为Student实现了Comparable接口,所以可以通过Array.sort()方法进行排序,完成比较。

 public static void main(String[] args) {
        Student[] students = new Student[3];
        students[0] = new Student("张三",20);
        students[1] = new Student("李四",21);
        students[2] = new Student("王五",22);
        Arrays.sort(students);
        System.out.println(Arrays.toString(students));
 }

Comparator接口

Comparable接口会把方法写死,无法灵活比较。如果想灵活比较,我们可以使用Comparator接口来解决这个问题。

我们先写一个类来比较Student

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

然后在main函数里实例化,再把对象传到Array.sort()方法里就行了。如果想通过其他方式来比较同上。

 public static void main(String[] args) {
        Student[] students = new Student[3];
        students[0] = new Student("张三",29);
        students[1] = new Student("李四",22);
        students[2] = new Student("王五",25);
        AgeComparator ageComparator = new AgeComparator();
        Arrays.sort(students,ageComparator);
        System.out.println(Arrays.toString(students));
 }

Comparable Comparator equals 比较

 public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
 }

 Comparable会把比较方法写死,无法通过其他方法比较,不够灵活。

Comparator它可以写很多方法比较,十分灵活,想用什么方法就用什么方法。

equals他是用来比较俩个对象是否相同。

拷贝

拷贝步骤如下

1. 首先要重写类中的clone()方法,由于Obiect是所有类的父类,所以可直接重写。

2. 然后clone()返回类型是Object,所以要向下转型

3. 实现Cloneable接口,该接口是空接口,但必须实现用来表示类可以被克隆。

4. 在调用clone()方法之前,要实现throws CloneNotSupportedException异常。

public class Student implements Cloneable{
    public String name;
    public int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

 public static void main(String[] args) throws CloneNotSupportedException{
        Student student1 = new Student("张三",25);
        Student student2 = (Student) student1.clone();
 
}

深拷贝和浅拷贝区别

二者的区别在于有多要个类拷贝,是否全不拷贝。如果把其他对象开辟的新空间拷贝过去,就是深拷贝。如果没有,就是浅拷贝。

如果想深拷贝,就要对Student类中m对象的类实行Cloneable接口,并重写clone()方法。

class Money implements Cloneable{
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
    public int money = 10;
}
public class Student implements Cloneable{
    public String name;
    public int age;
    public Money m = new Money();
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        Student tmp = (Student) super.clone();
        tmp.m = (Money) this.m.clone();
        return tmp;
    }
}

标签:name,age,public,Student,new,拷贝,比较,String
From: https://blog.csdn.net/2301_81225368/article/details/142431106

相关文章

  • 字符串比较函数的编写(自己编写一个strcmp函数)
    //17.字符串比较函数的编写\nintdemo2(charstr1[],charstr2[]){ while((*str1++==*str2++)&&*str1&&*str2){//不等长则跳出时指向当前不相等位(++后有一位为空),等长不一样则跳出时指向不相等的下一位 // printf("%c%c\n",*str1,*str2); } if((*str2==*str1)&&(*......
  • Python 高阶内容:深拷贝与浅拷贝揭秘复制的“玄学”
    Python高阶内容:深拷贝与浅拷贝揭秘复制的“玄学”文章目录Python高阶内容:深拷贝与浅拷贝揭秘复制的“玄学”一copy数据示例一示例二二深拷贝与浅拷贝三copy对比基本概念对比实现方式对比四完整代码示例五源码地址在Python中,复制操作并不是简单地将对......
  • 【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略
    文章目录C++类与对象前言读者须知RVO与NRVO的启用条件如何确认优化是否启用?1.按值传递与拷贝省略1.1按值传递的概念1.2示例代码1.3按值传递的性能影响1.3.1完全不优化1.4不同编译器下的优化表现1.4.1VisualStudio2019普通优化1.4.2VisualStudio2022激进......
  • 将阮一峰老师的《ES6入门教程》的源码拷贝本地运行和发布
    你好同学,我是沐爸,欢迎点赞、收藏、评论和关注。阮一峰老师的《ES6入门教程》应该是很多同学学习ES6知识的重要参考吧,应该也有很多同学在看该文档的时候,想知道这个教程的前端源码是怎么实现的,也可能有同学下载了源码,发现运行起来不能正常切换,然后放弃了。今天分享下《ES6......
  • OpenCV(YCrCb 和 HSV 颜色空间比较)
    目录1.YCrCb颜色空间1.1YCrCb颜色空间的定义1.2YCrCb的转换1.3应用场景2.HSV颜色空间2.1HSV颜色空间的定义2.2HSV的转换2.3应用场景3.YCrCb和HSV颜色空间的比较4.总结在图像处理领域中,除了传统的RGB颜色空间之外,YCrCb和HSV颜色空间被广泛应用于各种图......