zoukankan      html  css  js  c++  java
  • java对象比较器和克隆

      一.比较器Comparable和Comparator

      上一篇博客介绍了工具类Arrays工具类 。我们可以对基本类型的数组调用Arrays.sort()函数来进行数组的排序。排序操作在日常开发中经常要使用到。那么String类和自定义类能不能使用Arrays.sort()来进行排序呢。下面我们来试试,如下:

      Java代码

    publicclassMystring {

    publicstaticvoidmain(String[] args) {

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

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

    newPerson("小红",14),newPerson("小紫",20)};

    Arrays.sort(a);

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

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

    System.out.print(" ");

    Arrays.sort(b);

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

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

    }

    }

    //自定义类

    classPerson {

    publicString name;

    publicintage;

    publicPerson(String name,intage) {

    this.name=name;

    this.age=age;

    }

    }

      程序运行结果:

      我们发现String可以调用Arrays.sort()函数,而我们自定义的Person类报错,看错误的关键字Comparable

      打开String源码

      由此引入比较器Comparable,我们下面利用Comparable接口来实现Person使用Arrays.sort()按年龄排序递增排序。

    Comparable接口能够对实现它的类的对象进行排序,主要使用compareTo函数来实现排序。compareTo函数返回int类型,分别返回-1,0,1对应小于,等于,大于。

      把代码改为:

      Java代码

    publicclassMystring {

    publicstaticvoidmain(String[] args) {

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

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

    newPerson("小红",14),newPerson("小紫",20)};

    Arrays.sort(a);

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

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

    System.out.print(" ");

    Arrays.sort(b);

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

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

    }

    }

    //自定义类

    classPerson implementsComparable<Person>{

    publicString name;

    publicintage;

    publicPerson(String name,intage) {

    this.name=name;

    this.age=age;

    }

    //比较器的比较函数

    /**

    * 如果当前对象小于比较对象,返回-1

    * 如果当前对象等于比较对象,返回0

    * 如果当前对象大于比较对象,返回1

    */

    @Override

    publicintcompareTo(Person o) {

    //对象为空,抛出空指针异常

    if(o==null)

    thrownewNullPointerException();

    if(this.age<o.age)

    return-1;

    if(this.age>o.age)

    return1;

    return0;

    }

    //重写toString方法

    @Override

    publicString toString() {

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

    }

    }

      运行结果:

      为自定义的Person实现比较器Comparable接口,即可调用Arrays.sort()进行排序。

      另外还有另一种实现方法,实现Comparator接口。

      Java代码

    publicclassMystring {

    publicstaticvoidmain(String[] args) {

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

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

    newPerson("小红",14),newPerson("小紫",20)};

    Arrays.sort(a);

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

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

    System.out.print(" ");

    Arrays.sort(b,newPersonComparator());

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

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

    }

    }

    //自定义类

    classPerson {

    publicString name;

    publicintage;

    publicPerson(String name,intage) {

    this.name=name;

    this.age=age;

    }

    @Override

    publicString toString() {

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

    }

    }

    classPersonComparator implementsComparator<Person>{

    //比较器的比较函数

    /**

    * 如果当前对象小于比较对象,返回-1

    * 如果当前对象等于比较对象,返回0

    * 如果当前对象大于比较对象,返回1

    */

    @Override

    publicintcompare(Person o1, Person o2) {

    //对象为空,抛出空指针异常

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

    thrownewNullPointerException();

    if(o1.age<o2.age)

    return-1;

    if(o1.age>o2.age)

    return1;

    return0;

    }

    }

    二.对象的克隆Clone

      将一个对象复制一份,称作对象的克隆技术。克隆对象分为两步。

      1.实现Cloneable标记接口

      Cloneable是一个标记接口,此接口没有定义任何方法。只是作为一个标记给虚拟机。

      2.重写Object的clone方法

      Java代码

    //自定义类person实现Cloneable接口

    classPerson implementsCloneable {

    publicString name;

    publicintage;

    publicPerson(String name,intage) {

    this.name=name;

    this.age=age;

    }

    //重写Object的clone方法

    @Override

    protectedObject clone() throwsCloneNotSupportedException

    {

    returnsuper.clone();

    }

    }

      克隆的调用:

      Java代码

    publicstaticvoidmain(String[] args) {

    Person temp=newPerson("王尼玛",18);

    try{

    Person ok=(Person)temp.clone();//把Object类转化为Person、

    System.out.println(ok.name);//输出王尼玛

    } catch(CloneNotSupportedException e) {

    e.printStackTrace();

    }

    }

      这样既可以完成对一个对象的克隆,当我们要创建一系列类似的对象时,可以考虑使用克隆技术可以得到更好的性能,比你new创建好一些。

    技术分享:凯哥学堂

  • 相关阅读:
    java实现网上购物车的简单功能
    java类的访问权限
    linux shell 参数传递
    shell编程之tput
    Linux编程时获取当前时间实例解析
    shell中的引号,单引号,反引号
    Linux 查看Shell类型
    迭代器(lterator)
    在AIX系统下查询硬件信息的方法
    LINUX,HPUX,AIX系统查询主机配置信息
  • 原文地址:https://www.cnblogs.com/kaige123/p/5754546.html
Copyright © 2011-2022 走看看