Java的Comparable,Comparator和Cloneable三大接口详解

作者:反内码者 时间:2023-07-14 11:18:48 

1、比较器

①比较器的引入

a.首先,当我们单一地比较某一种数据类型的数组时,可以直接用Arrays.sort()进行实现

Java的Comparable,Comparator和Cloneable三大接口详解

b.而当我们同时含有多个参数时,并没有告诉我们按照什么来进行排序,此时,若是用Arrays.sort()就会出现报错的情况

Java的Comparable,Comparator和Cloneable三大接口详解

 基于这种情况,我们了解到,若是要将自定义类型进行大小比较 ,就要引入能够实现比较的接口,下面我们介绍Comparable和Comparator这两种比较器

1.1Comparable接口

①实现Comparable接口的操作

Java的Comparable,Comparator和Cloneable三大接口详解

②通过Comparable接口实现年龄的排序

Java的Comparable,Comparator和Cloneable三大接口详解

③通过Comparable来实现名字的排序(注意名字是引用类,比较时应该是用compareTo()来进行)

Java的Comparable,Comparator和Cloneable三大接口详解

④升序降序

由于最终是利用的Arrays.sort()进行的比较,该方法底层是升序的操作,若是想转换为降序,只需要将重写的compareTo()方法中两项互换位置即可

Java的Comparable,Comparator和Cloneable三大接口详解

变为降序后代码运行结果:

Java的Comparable,Comparator和Cloneable三大接口详解

 ⑤缺点!!!

Comparable对类的倾入性很强。由上面我们可知,要想比较新的类型就要更改compareTo()中的类型重新进行比较,这个在以后的工作中极大可能会使整个代码出现逻辑问题,可读性问题,因此我们引入下一类很灵活,倾入性不强的Comparator接口

⑥整体代码如下:

import java.util.Arrays;
class Student implements Comparable<Student> {
   public int age;
   public String name;
   public double score;
   public Student(int age,String name,double score){
       this.age=age;
       this.name=name;
       this.score=score;
   }
    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", score=" + score +
                '}';
    }
   public static void main3(String[] args) {
       Student student1=new Student(12,"张三",98.0);
       Student student2=new Student(18,"李四",97.9);
       //if(student1.compareTo(student2)>0)返回1;根据下面的方法进行进一步的返回
       System.out.println(student1.compareTo(student2));
   }
   public static void main(String[] args) {
       Student []student=new Student[3];
       student[0]=new Student(36,"zhangsan",98.0);
       student[1]=new Student(18,"lisi",97.9);
       student[2]=new Student(27,"wangwu",65.3);
       System.out.println(Arrays.toString(student));
       Arrays.sort(student);
       System.out.println(Arrays.toString(student));
   }
    public static void main1(String[] args) {
        int []array=new int []{2,5,3,6,8};
        System.out.println(Arrays.toString(array));
        Arrays.sort(array);
        System.out.println(Arrays.toString(array));
    }
   @Override
//谁调用这个方法,谁就是this
   public int compareTo(Student o) {
   //return this.age-o.age;
   return o.name.compareTo(this.name);
   }
}

1.2Comparator接口

①实现Comparable接口的操作:

Java的Comparable,Comparator和Cloneable三大接口详解

②通过该接口实现的姓名的比较:

Java的Comparable,Comparator和Cloneable三大接口详解

③升序降序

Java的Comparable,Comparator和Cloneable三大接口详解

执行后的结果: 

Java的Comparable,Comparator和Cloneable三大接口详解

④优点

灵活,对类的倾入性不强 

⑤整体代码如下:

import java.util.Arrays;
import java.util.Comparator;
class Student {
   public int age;
   public String name;
   public double score;
   public Student(int age, String name, double score) {
       this.age = age;
       this.name = name;
       this.score = score;
   }
   @Override
   public String toString() {
       return "Student{" +
               "age=" + age +
               ", name='" + name + '\'' +
               ", score=" + score +
               '}';
   }
}
class AgeComparator implements Comparator<Student> {
   @Override
   public int compare(Student o1, Student o2) {
       return o1.age-o2.age;
   }
}
class ScoreComparator implements Comparator<Student> {
   @Override
   public int compare(Student o1, Student o2) {
       return (int)(o1.score-o2.score);
   }
}
class NameComparator implements Comparator<Student> {
   @Override
   public int compare(Student o1, Student o2) {
       return o1.name.compareTo(o2.name);
   }
}
public class Test {
   public static void main2(String[] args) {
       Student students1 = new Student(1,"bit",98.9);
       Student students2 = new Student(2,"abc",88.9);
      /* if(students1.compareTo( students2) > 0) {
       }*/
       //System.out.println(students1.compareTo( students2));
       AgeComparator ageComparator = new AgeComparator();
       System.out.println(ageComparator.compare(students1,students2));
   }
   public static void main(String[] args) {
       Student[] student = new Student[3];
       student[0] = new Student(12,"lisi",98.9);
       student[1] = new Student(6,"zangwu",88.9);
       student[2] = new Student(18,"whangsan",18.9);
       System.out.println(Arrays.toString(student));
       AgeComparator ageComparator = new AgeComparator();
       ScoreComparator scoreComparator = new ScoreComparator();
       NameComparator nameComparator = new NameComparator();
       Arrays.sort(student,nameComparator);//默认是从小到大的排序
       System.out.println(Arrays.toString(student));
   }
   public static void main1(String[] args) {
       int[] array = {1,21,3,14,5,16};
       System.out.println(Arrays.toString(array));
       Arrays.sort(array);
       System.out.println(Arrays.toString(array));
   }
}

2、Cloneable接口

①如何实现Cloneable接口:

Object 类中存在一个 clone 方法, 调用这个方法可以创建一个对象的 "拷贝". 但是要想合法调用 clone 方法, 必须要先实现 Clonable 接口, 否则就会抛出 CloneNotSupportedException 异常。

a.实现Cloneable接口

Java的Comparable,Comparator和Cloneable三大接口详解

b.重写Cloneable方法

Java的Comparable,Comparator和Cloneable三大接口详解

c.抛异常,强制类型转换

Java的Comparable,Comparator和Cloneable三大接口详解

②面试中常问问题:

你知道Cloneable接口吗?为什么它是一个空接口,它有什么作用呢?

空接口,标志接口,代表这个类是可以被克隆的

③克隆的原理图:

Java的Comparable,Comparator和Cloneable三大接口详解

④整体代码的实现:

class Person implements Cloneable{
   public int age;
   public void eat(){
       System.out.println("吃!");
   }
   @Override
   public String toString() {
       return "Person{" +
               "age=" + age +
               '}';
   }
   @Override
   protected Object clone() throws CloneNotSupportedException {
       return super.clone();
   }
}
public class TestDemo {
   public static void main(String[] args) throws CloneNotSupportedException {
       Person person = new Person();
       person.age=13;
       Person person2=(Person)person.clone();
       System.out.println(person2);
       System.out.println(person);
       System.out.println("===========");
       person2.age=14;
       System.out.println(person);
       System.out.println(person2);
   }
}

2.1深拷贝和浅拷贝

①深浅拷贝:

决定是深拷贝还是浅拷贝,并不是方法的用途,而是代码的实现

②浅拷贝示例

Java的Comparable,Comparator和Cloneable三大接口详解

Java的Comparable,Comparator和Cloneable三大接口详解

浅拷贝代码如下:

class Money implements Cloneable{
   public double m = 12.5;
}
class Person implements Cloneable{
   public int age;
   public Money money = new Money();
   public void eat() {
       System.out.println("吃!");
   }
   @Override
   public String toString() {
       return "Person{" +
               "age=" + age +
               '}';
   }
   @Override
   protected Object clone() throws CloneNotSupportedException {
       Person tmp = (Person)super.clone();
       return tmp;
   }
}
public class TestDemo {
   public static void main(String[] args) throws CloneNotSupportedException {
       Person person = new Person();
       Person person2 = (Person)person.clone();
       System.out.println(person.money.m);
       System.out.println(person2.money.m);
       System.out.println("=====================");
       person2.money.m = 98.5;
       System.out.println(person.money.m);
       System.out.println(person2.money.m);
   }
}

③深拷贝示例:(将tmp中的money也进行拷贝)

Java的Comparable,Comparator和Cloneable三大接口详解

深拷贝代码如下:

class Money implements Cloneable{
   public double m = 12.5;
   @Override
   protected Object clone() throws CloneNotSupportedException {
       return super.clone();
   }
}
class Person implements Cloneable{
   public int age;
   public Money money = new Money();
   public void eat() {
       System.out.println("吃!");
   }
   @Override
   public String toString() {
       return "Person{" +
               "age=" + age +
               '}';
   }
   @Override
   protected Object clone() throws CloneNotSupportedException {
       Person tmp = (Person)super.clone();
       tmp.money = (Money) this.money.clone();
       return tmp;
       //return super.clone();
   }
}
public class TestDemo {
   public static void main(String[] args) throws CloneNotSupportedException {
       Person person = new Person();
       Person person2 = (Person)person.clone();
       System.out.println(person.money.m);
       System.out.println(person2.money.m);
       System.out.println("=====================");
       person2.money.m = 98.5;
       System.out.println(person.money.m);
       System.out.println(person2.money.m);
   }
}

来源:https://blog.csdn.net/weixin_58850105/article/details/123438815

标签:Java,Cloneable,Comparator,Comparable
0
投稿

猜你喜欢

  • c#实现16进制和字符串之间转换的代码

    2023-07-22 08:28:09
  • C++类中的特殊成员函数示例详解

    2023-11-07 13:02:08
  • Android开发手册shape属性和子属性使用说明

    2023-11-02 09:44:43
  • java&javascript自定义加密数据传输代码示例

    2021-11-29 02:09:33
  • JAVA利用HttpClient进行HTTPS接口调用的方法

    2023-10-24 16:28:11
  • Android仿淘宝商品详情页

    2023-09-08 18:37:26
  • 在Spring环境中正确关闭线程池的姿势

    2023-11-25 08:07:29
  • Java Spring5学习之JdbcTemplate详解

    2023-11-25 20:17:23
  • C#多线程异步执行和跨线程访问控件Helper

    2022-02-09 12:24:32
  • android 使用kotlin 实现点击更换全局语言(中日英切换)

    2023-11-18 03:08:50
  • Android Jetpack库剖析之LiveData组件篇

    2022-08-31 02:08:13
  • Mybatis-plus foreach拼接字符串查询无数据返回问题

    2022-09-26 17:29:02
  • WPF中鼠标/键盘/拖拽事件以及用行为封装事件详解

    2021-05-24 00:22:38
  • Kotlin基础学习之循环和异常

    2023-05-26 00:42:12
  • SpringBoot如何通过devtools实现热部署

    2022-07-23 10:04:10
  • Spring之@Aspect中通知的5种方式详解

    2021-12-12 20:28:02
  • Android编程实现拍照功能的2种方法分析

    2023-10-16 19:02:25
  • SpringBoot使用自动配置xxxAutoConfiguration

    2022-11-20 09:05:56
  • Java如何利用状态模式(state pattern)替代if else

    2021-08-15 09:31:08
  • java实现图片裁切的工具类实例

    2021-06-29 14:45:58
  • asp之家 软件编程 m.aspxhome.com