天天看點

【java對象比較器和克隆】

一.比較器Comparable和Comparator

           上一篇部落格介紹了工具類Arrays工具類。我們可以對基本類型的數組調用Arrays.sort()函數來進行數組的排序。排序操作在日常開發中經常要使用到。那麼String類和自定義類能不能使用Arrays.sort()來進行排序呢。下面我們來試試,如下:

public class Mystring {  

    public static void main(String[] args) {  

       String []a={"早上","中午","下午","傍晚","晚上"};  

       Person[] b={ new Person("小白",15),new Person("小黑",19),  

                    new Person("小紅",14),new Person("小紫",20)};     

       Arrays.sort(a);  

       for(int i=0;i<a.length;i++)  

           System.out.print(a[i]);  

       System.out.print("\r\n");  

       Arrays.sort(b);  

       for(int i=0;i<b.length;i++)  

           System.out.println(b[i]);  

    }  

}  

//自定義類  

class Person {  

    public String name;  

    public int age;   

    public Person(String name,int age) {  

        this.name=name;  

        this.age=age;  

複制代碼

程式運作結果:

我們發現String可以調用Arrays.sort()函數,而我們自定義的Person類報錯,看錯誤的關鍵字 Comparable

打開String源碼

由此引入比較器Comparable,我們下面利用Comparable接口來實作Person使用Arrays.sort()按年齡排序遞增排序。

    Comparable接口能夠對實作它的類的對象進行排序,主要使用compareTo函數來實作排序。compareTo函數傳回int類型,分别傳回-1,0,1對應小于,等于,大于。

  把代碼改為:

class Person implements Comparable<Person>{  

    //比較器的比較函數  

    /** 

     * 如果目前對象小于比較對象,傳回-1 

     * 如果目前對象等于比較對象,傳回0 

     * 如果目前對象大于比較對象,傳回1 

     */  

    @Override  

    public int compareTo(Person o) {  

        //對象為空,抛出空指針異常  

        if(o==null)  

            throw new NullPointerException();  

        if(this.age<o.age)  

            return -1;  

        if(this.age>o.age)  

            return 1;  

        return 0;  

    //重寫toString方法  

    public String toString() {  

        return "Person [name=" + name + ", age=" + age + "]";  

為自定義的Person實作比較器Comparable接口,即可調用Arrays.sort()進行排序。

另外還有另一種實作方法,實作Comparator接口。

       Arrays.sort(b,new PersonComparator());  

class Person {    

class PersonComparator implements Comparator<Person>{  

     //比較器的比較函數  

        /** 

         * 如果目前對象小于比較對象,傳回-1 

         * 如果目前對象等于比較對象,傳回0 

         * 如果目前對象大于比較對象,傳回1 

         */  

    public int compare(Person o1, Person o2) {  

        if(o1==null||o2==null)  

        if(o1.age<o2.age)  

        if(o1.age>o2.age)  

二.對象的克隆Clone

将一個對象複制一份,稱作對象的克隆技術。克隆對象分為兩步。

1.實作Cloneable标記接口

       Cloneable是一個标記接口,此接口沒有定義任何方法。隻是作為一個标記給虛拟機。

2.重寫Object的clone方法

//自定義類person實作Cloneable接口  

class Person implements Cloneable {   

    //重寫Object的clone方法  

    protected Object clone() throws CloneNotSupportedException  

    {  

        return super.clone();  

克隆的調用:

public static void main(String[] args) {  

         Person temp=new Person("王尼瑪",18);  

         try {  

            Person ok=(Person)temp.clone();//把Object類轉化為Person、  

            System.out.println(ok.name);//輸出王尼瑪  

        } catch (CloneNotSupportedException e) {  

            e.printStackTrace();  

        }  

這樣既可以完成對一個對象的克隆,當我們要建立一系列類似的對象時,可以考慮使用克隆技術可以得到更好的性能,比你new建立好一些

繼續閱讀