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

比较器,深拷贝,浅拷贝

时间:2024-09-24 12:51:01浏览次数:11  
标签: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

相关文章

  • std::vector 和 std::map 都支持以下比较运算符
    在C++标准库中,std::vector和std::map都支持以下比较运算符:==(相等运算符)!=(不等运算符)<(小于运算符)<=(小于等于运算符)>(大于运算符)>=(大于等于运算符)1.std::vector的比较对于std::vector,这些运算符通过词典序比较(lexicographicalcomparison)进行。词典序比较类似于字......
  • [OpenCV] 数字图像处理 C++ 学习——16直方图均衡化、直方图比较 详细讲解+附完整代码
    文章目录前言1.直方图均衡化的理论基础(1)什么是直方图(2)直方图均衡化原理(3)直方图均衡化公式2.直方图比较理论基础(1)相关性(Correlation)——HISTCMP_CORREL(2)卡方(Chi-Square)——HISTCMP_CHISQR(3)十字交叉性(Intersection)——HISTCMP_INTERSECT(4)巴氏距离......
  • 字符串比较函数的编写(自己编写一个strcmp函数)
    //17.字符串比较函数的编写\nintdemo2(charstr1[],charstr2[]){ while((*str1++==*str2++)&&*str1&&*str2){//不等长则跳出时指向当前不相等位(++后有一位为空),等长不一样则跳出时指向不相等的下一位 // printf("%c%c\n",*str1,*str2); } if((*str2==*str1)&&(*......
  • Python&C++迭代器比较
    Python&C++迭代器比较内容在Python和C++中,迭代器的概念都有类似的作用,但它们的实现方式和细节上存在一些区别。下面我们将从迭代器的定义、特性以及Python和C++中的不同点来进行对比。1.什么是迭代器?迭代器是一种对象,它允许你遍历一个集合(如列表、字典、字符串等)中......
  • C#|.net core 基础 - 深拷贝的五大类N种实现方式
    在实际应用中经常会有这样的需求:获取一个与原对象数据相同但是独立于原对象的精准副本,简单来说就是克隆一份,拷贝一份,复制一份和原对象一样的对象,但是两者各种修改不能互相影响。这一行为也叫深克隆,深拷贝。在C#里拷贝对象是一个看似简单实则相当复杂的事情,因此我不建议自己去做......
  • 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激进......
  • GraphRAG 与 RAG 的比较分析
    检索增强生成(RAG)技术概述检索增强生成(Retrieval-AugmentedGeneration,简称RAG)是一种旨在提升大型语言模型(LargeLanguageModels,LLMs)性能的技术方法。其核心思想是通过整合外部可靠知识库的信息来增强模型的输出质量。RAG的工作原理可以概括如下:当LLM接收到查询时,它不仅依赖......
  • 将阮一峰老师的《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颜色空间被广泛应用于各种图......