欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java对象比较器和克隆

程序员文章站 2022-03-14 12:49:37
...

  一.比较器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("\r\n");

 

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;

 

}

 

}

  程序运行结果:

  java对象比较器和克隆
            
    
    博客分类: java Javajava对象Java克隆 

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

 

Comparable

  打开String源码

  java对象比较器和克隆
            
    
    博客分类: java Javajava对象Java克隆 

  由此引入比较器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("\r\n");

 

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 + "]";

 

}

 

}

  运行结果:

  java对象比较器和克隆
            
    
    博客分类: java Javajava对象Java克隆 

  为自定义的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("\r\n");

 

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

 

技术分享:凯哥学堂