Beherrschen Sie die drei Hauptschnittstellen Comparable, Comparator und Cloneable?

Ich habe kürzlich eine Frage gestellt,

Ich fand mich in dieser Hinsicht schwach,

Folgendes Wissen wurde überprüft und aussortiert:

Hoffe es wird dir auch helfen~~~~~~

Inhalt

1. Komparator

1.1 Vergleichbare Schnittstelle

1.2Komparatorschnittstelle

2. Klonbare Schnittstelle

2.1 Tiefe Kopie und flache Kopie


1. Komparator

①Einführung des Komparators

a) Zunächst einmal können wir, wenn wir Arrays eines bestimmten Datentyps vergleichen, direkt Arrays.sort() für die Implementierung verwenden

b. Wenn wir mehrere Parameter gleichzeitig haben, sagt es uns nicht, wonach wir sortieren sollen. Wenn wir zu diesem Zeitpunkt Arrays.sort() verwenden, tritt ein Fehler auf.

 Basierend auf dieser Situation haben wir gelernt, dass wir, wenn wir die Größe eines benutzerdefinierten Typs vergleichen wollen, eine Schnittstelle einführen müssen, die den Vergleich implementieren kann.Lassen Sie uns die beiden Komparatoren Comparable und Comparator vorstellen.

1.1 Vergleichbare Schnittstelle

① Implementieren Sie den Betrieb der vergleichbaren Schnittstelle

②Die Alterssortierung erfolgt über die Vergleichsschnittstelle

 ③ Implementieren Sie die Sortierung von Namen durch Comparable (beachten Sie, dass der Name eine Referenzklasse ist und CompareTo() zum Vergleich verwendet werden sollte)

④ aufsteigend absteigend

Da der abschließende Vergleich mithilfe von Arrays.sort() durchgeführt wird, stellt die unterste Ebene dieser Methode eine aufsteigende Reihenfolge dar. Wenn Sie in absteigende Reihenfolge konvertieren möchten, müssen Sie nur die beiden Positionen in der umgeschriebenen Methode „compareTo()“ austauschen .

Das Ergebnis der Ausführung des Codes nach dem Wechsel in absteigende Reihenfolge:

 ⑤ Nachteile! ! !

Comparable hat eine starke Neigung zu Klassen. Aus dem Obigen können wir ersehen, dass wir, wenn wir neue Typen vergleichen wollen, die Typen in CompareTo() ändern und erneut vergleichen müssen, was höchstwahrscheinlich zu logischen Problemen und Lesbarkeitsproblemen im gesamten Code in der zukünftigen Arbeit führen wird , führen wir Folgendes ein: Eine Art von Comparator-Schnittstelle, die sehr flexibel und nicht stark geneigt
ist ⑥ Der Gesamtcode lautet wie folgt:

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.2Komparatorschnittstelle

① Implementieren Sie den Betrieb der vergleichbaren Schnittstelle:

②Über diese Schnittstelle implementierter Namensvergleich:

③ aufsteigend absteigend

Ergebnis nach Ausführung: 

④Vorteile

Flexibel, keine starke Neigung zum Unterricht 

⑤ Der Gesamtcode lautet wie folgt:

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. Klonbare Schnittstelle

①So implementieren Sie die klonbare Schnittstelle:

Es gibt eine Clone - Methode in der Object-Klasse. Der Aufruf dieser Methode kann eine " Kopie " eines Objekts erstellen. Um die Clone - Methode jedoch legal aufrufen zu können, muss zuerst die Clonable- Schnittstelle implementiert werden , andernfalls wird eine CloneNotSupportedException geworfen .

a. Implementieren Sie die Cloneable-Schnittstelle

b. Überschreiben Sie die Cloneable-Methode

 c. Throw-Ausnahme, Umwandlungstyp

② Häufig gestellte Fragen in Vorstellungsgesprächen:

Kennen Sie die klonbare Schnittstelle? Warum ist es eine leere Schnittstelle und was macht sie?

Das leere Interface, das Flag-Interface, bedeutet, dass diese Klasse geklont werden kann

③ Das ​​schematische Diagramm des Klons:

④ Umsetzung des Gesamtkodex:

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 Tiefe Kopie und flache Kopie

①Dunkle und flache Kopie:

Die Entscheidung, eine tiefe Kopie oder eine flache Kopie zu erstellen, ist nicht der Zweck der Methode, sondern die Implementierung des Codes

②Beispiel für eine flache Kopie

 

Der flache Kopiercode lautet wie folgt:

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

 ③Beispiel für eine tiefe Kopie: (Kopiere das Geld auch in tmp)

Der Deep-Copy-Code lautet wie folgt:

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

Danke fürs Zuschauen~~~(* ̄︶ ̄)

Ich denke du magst

Origin blog.csdn.net/weixin_58850105/article/details/123438815
Empfohlen
Rangfolge