天天看点

【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创建好一些

继续阅读