?Java?SE?面向?qū)ο缶幊痰?個常用接口
1.Comparable
前言,想要排序Student.有代碼:
import java.util.Arrays; ? 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 + ? ? ? ? ? ? ? ? '}'; ? ? } } ? public class TestDemo { ? ? public static void main(String[] args) { ? ? ? ? Student[] students = new Student[3]; ? ? ? ? students[0] = new Student(12,"niubi",99.9); ? ? ? ? students[1] = new Student(20,"liuren",18.9); ? ? ? ? students[2] = new Student(80,"laoren",50.9); ? ? ? ? System.out.println(Arrays.toString(students)); ? ? ? ? ? Arrays.sort(students); ? ? ? ? ? System.out.println(Arrays.toString(students)); ? ? } }
此代碼運行報錯:
原因: 沒有告訴要如何進行排序,是年齡還是姓名還是分數(shù).沒有告訴比較的規(guī)則
解決方式:
如果自定義的數(shù)據(jù)類型 進行大小比較 一定要實現(xiàn)可以比較的接口
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 + ? ? ? ? ? ? ? ? '}'; ? ? } ? ? ? //誰調(diào)用這個方法 誰就是this ? ? @Override ? ? public int compareTo(Student o) { ? ? ? ? //return this.age - o.age;//從小到大 ? ? ? ? return o.age - this.age;//從大到小 ? ? } ? } ? public class TestDemo { ? ? ? public static void main(String[] args) { ? ? ? ? Student[] students = new Student[3]; ? ? ? ? students[0] = new Student(12,"niubi",99.9); ? ? ? ? students[1] = new Student(6,"liuren",18.9); ? ? ? ? students[2] = new Student(80,"laoren",50.9); ? ? ? ? System.out.println("比較前 "+Arrays.toString(students)); ? ? ? ? ? Arrays.sort(students);//默認從小到大排序 ? ? ? ? ? System.out.println("比較后 "+Arrays.toString(students)); ? ? } }
如果要 分數(shù)比較 和 姓名比較
? //誰調(diào)用這個方法 誰就是this ? ? @Override ? ? public int compareTo(Student o) { ? ? ? ? //return this.age - o.age;//從小到大 ? ? ? ? //return o.age - this.age;//從大到小 ? ? ? ? return (int) (this.score - o.score);//分數(shù)排序 ? ? ? ? return this.name.compareTo(o.name);//姓名排序 ? ? }
缺點: 這個接口對類的侵入性非常強.一旦寫好了,不敢輕易改動.
如何降低對類的侵入性呢?
使用Comparator
2.Comparator 比較器
import java.util.Arrays; import java.util.Comparator; ? class Student1 { ? ? public int age; ? ? public String name; ? ? public double score; ? ? ? public Student1(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<Student1>{ ? ? @Override ? ? public int compare(Student1 o1, Student1 o2) { ? ? ? ? return o1.age - o2.age; ? ? } } ? class ScoreComparator implements Comparator<Student1>{ ? ? @Override ? ? public int compare(Student1 o1, Student1 o2) { ? ? ? ? return (int) (o1.score - o2.score); ? ? } } ? class NameComparator implements Comparator<Student1>{ ? ? @Override ? ? public int compare(Student1 o1, Student1 o2) { ? ? ? ? return o1.name.compareTo(o2.name); ? ? } } ? public class TestDemo1 { ? ? ? public static void main(String[] args) { ? ? ? ? Student1[] students1 = new Student1[3]; ? ? ? ? students1[0] = new Student1(12,"niubi",99.9); ? ? ? ? students1[1] = new Student1(6,"liuren",18.9); ? ? ? ? students1[2] = new Student1(80,"laoren",50.9); ? ? ? ? System.out.println("比較前 "+Arrays.toString(students1)); ? ? ? ? ? AgeComparator ageComparator = new AgeComparator(); ? ? ? ? Arrays.sort(students1,ageComparator); ? ? ? ? System.out.println("比較后(按年齡) "+Arrays.toString(students1)); ? ? ? ? ? ScoreComparator scoreComparator = new ScoreComparator(); ? ? ? ? Arrays.sort(students1,scoreComparator); ? ? ? ? System.out.println("比較后(按姓名) "+Arrays.toString(students1)); ? ? ? ? ? NameComparator nameComparator = new NameComparator(); ? ? ? ? Arrays.sort(students1,nameComparator); ? ? ? ? System.out.println("比較后(按分數(shù)) "+Arrays.toString(students1)); ? ? } }
運行結(jié)果:
優(yōu)點:對類的侵入性非常弱.
3.Cloneable
面試問題:
你知道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 TestDemo2 { ? ? public static void main(String[] args) throws CloneNotSupportedException { ? ? ? ? Person person = new Person(); ? ? ? ? person.age = 99; ? ? ? ? Person person2 = (Person) person.clone(); ? ? ? ? System.out.println(person.age); ? ? ? ? System.out.println(person2.age); ? ? ? ? ? System.out.println("=========="); ? ? ? ? person2.age = 199; ? ? ? ? System.out.println(person.age); ? ? ? ? System.out.println(person2.age); ? ? } }
運行結(jié)果:
注意事項:
- 1.引用的對象要想被克隆,必須實現(xiàn)Cloneable接口.
- 2.必須重寫克隆方法,并且聲明異常.
到此這篇關于 Java SE 面向?qū)ο缶幊痰?個常用接口的文章就介紹到這了,更多相關 Java SE 面向?qū)ο缶幊探涌趦?nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
用python實現(xiàn)域名資產(chǎn)監(jiān)控的詳細步驟
域名資產(chǎn)監(jiān)控,通過輸入一個主域名,找到該域名對應的ip地址所在的服務器的端口開閉情況,本文重點給大家介紹用python實現(xiàn)域名資產(chǎn)監(jiān)控的問題,需要的朋友可以參考下2021-11-11python3中apply函數(shù)和lambda函數(shù)的使用詳解
本文主要介紹了python3中apply函數(shù)和lambda函數(shù)的使用詳解,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02Python中os.path模塊的8個神奇函數(shù)分享
在Python編程中,os.path模塊是一個非常重要的模塊,它提供了用于處理文件路徑和目錄的函數(shù),本文將介紹os.path模塊中最常用的8個內(nèi)置函數(shù),需要的可以參考下2023-11-11