¿Ha dominado las tres interfaces principales de Comparable, Comparator y Cloneable?

Estaba haciendo una pregunta recientemente,

Me encontré débil en este sentido,

Los siguientes conocimientos han sido revisados ​​y ordenados:

Espero que te sea útil a ti también~~~~~~

contenido

1. Comparador

1.1Interfaz comparable

1.2Interfaz del comparador

2. Interfaz clonable

2.1 Copia profunda y copia superficial


1. Comparador

①Introducción del comparador

a. En primer lugar, cuando comparamos arreglos de cierto tipo de datos, podemos usar directamente Arrays.sort() para la implementación

b.Cuando tenemos varios parámetros al mismo tiempo, no nos dice por qué ordenar, en este momento, si usamos Arrays.sort(), ocurrirá un error.

 En base a esta situación, aprendimos que si queremos comparar el tamaño de un tipo personalizado, debemos introducir una interfaz que pueda implementar la comparación. Presentemos los dos comparadores, Comparable y Comparator.

1.1Interfaz comparable

① Implementar el funcionamiento de la interfaz Comparable

②La clasificación de la edad se realiza a través de la interfaz Comparable

 ③ Implemente la clasificación de nombres a través de Comparable (tenga en cuenta que el nombre es una clase de referencia y se debe usar compareTo() para la comparación)

④ orden ascendente descendente

Dado que la comparación final se realiza utilizando Arrays.sort(), la capa inferior de este método es una operación de orden ascendente. Si desea convertir a orden descendente, solo necesita intercambiar las dos posiciones en el método compareTo() reescrito .

El resultado de ejecutar el código después de cambiar a orden descendente:

 ⑤ ¡Desventajas! ! !

Comparable tiene una fuerte inclinación hacia las clases. De lo anterior, podemos ver que si queremos comparar nuevos tipos, necesitamos cambiar los tipos en compareTo() y compararlos nuevamente. Esto probablemente causará problemas lógicos y problemas de legibilidad en todo el código en trabajos futuros. Por lo tanto, , presentamos el siguiente tipo de interfaz Comparator que es muy flexible y no tiene una fuerte inclinación
⑥ El código general es el siguiente:

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.2Interfaz del comparador

① Implementar el funcionamiento de la interfaz Comparable:

②Comparación de nombres implementados a través de esta interfaz:

③ orden ascendente descendente

Resultado después de la ejecución: 

④Ventajas

Flexible, sin fuerte inclinación a clases. 

⑤ El código general es el siguiente:

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. Interfaz clonable

①Cómo implementar la interfaz Clonable:

Hay un método de clonación en la clase Object. Llamar a este método puede crear una " copia " de un objeto. Sin embargo, para llamar legalmente al método de clonación , primero se debe implementar la interfaz Clonable , de lo contrario, se lanzará una CloneNotSupportedException .

a. Implementar la interfaz Clonable

b. Anular el método Clonable

 c. arrojar excepción, tipo de conversión

② Preguntas frecuentes en entrevistas:

¿Conoces la interfaz Clonable? ¿Por qué es una interfaz vacía y qué hace?

La interfaz vacía, la interfaz de bandera, significa que esta clase se puede clonar

③ El diagrama esquemático del clon:

④ Implementación del código general:

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 Copia profunda y copia superficial

①Copia oscura y superficial:

La decisión de hacer una copia profunda o una copia superficial no es el propósito del método, sino la implementación del código.

②Ejemplo de copia superficial

 

El código de copia superficial es el siguiente:

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);
    }
}

 ③Ejemplo de copia profunda: (copia también el dinero en tmp)

El código de copia profunda es el siguiente:

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);
    }
}

Gracias por mirar~~~(* ̄︶ ̄)

Supongo que te gusta

Origin blog.csdn.net/weixin_58850105/article/details/123438815
Recomendado
Clasificación