java对象比较器和克隆

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java对象比较器和克隆相关的知识,希望对你有一定的参考价值。

一.比较器Comparable和Comparator

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

Java代码

publicclassMystring {

  1. publicstaticvoidmain(String[] args) {

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

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

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

  5. Arrays.sort(a);

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

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

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

  9. Arrays.sort(b);

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

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

  12. }

  13. }

  14. //自定义类

  15. classPerson {

  16. publicString name;

  17. publicintage;

  18. publicPerson(String name,intage) {

  19. this.name=name;

  20. this.age=age;

  21. }

  22. }

程序运行结果:

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

打开String源码

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

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

把代码改为:

Java代码

  1. publicclassMystring {

  2. publicstaticvoidmain(String[] args) {

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

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

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

  6. Arrays.sort(a);

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

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

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

  10. Arrays.sort(b);

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

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

  13. }

  14. }

  15. //自定义类

  16. classPerson implementsComparable<Person>{

  17. publicString name;

  18. publicintage;

  19. publicPerson(String name,intage) {

  20. this.name=name;

  21. this.age=age;

  22. }

  23. //比较器的比较函数

  24. /**

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

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

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

  28. */

  29. @Override

  30. publicintcompareTo(Person o) {

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

  32. if(o==null)

  33. thrownewNullPointerException();

  34. if(this.age<o.age)

  35. return-1;

  36. if(this.age>o.age)

  37. return1;

  38. return0;

  39. }

  40. //重写toString方法

  41. @Override

  42. publicString toString() {

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

  44. }

  45. }

运行结果:

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

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

Java代码

  1. publicclassMystring {

  2. publicstaticvoidmain(String[] args) {

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

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

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

  6. Arrays.sort(a);

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

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

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

  10. Arrays.sort(b,newPersonComparator());

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

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

  13. }

  14. }

  15. //自定义类

  16. classPerson {

  17. publicString name;

  18. publicintage;

  19. publicPerson(String name,intage) {

  20. this.name=name;

  21. this.age=age;

  22. }

  23. @Override

  24. publicString toString() {

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

  26. }

  27. }

  28. classPersonComparator implementsComparator<Person>{

  29. //比较器的比较函数

  30. /**

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

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

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

  34. */

  35. @Override

  36. publicintcompare(Person o1, Person o2) {

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

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

  39. thrownewNullPointerException();

  40. if(o1.age<o2.age)

  41. return-1;

  42. if(o1.age>o2.age)

  43. return1;

  44. return0;

  45. }

  46. }

二.对象的克隆Clone

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

1.实现Cloneable标记接口

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

2.重写Object的clone方法

Java代码

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

  2. classPerson implementsCloneable {

  3. publicString name;

  4. publicintage;

  5. publicPerson(String name,intage) {

  6. this.name=name;

  7. this.age=age;

  8. }

  9. //重写Object的clone方法

  10. @Override

  11. protectedObject clone() throwsCloneNotSupportedException

  12. {

  13. returnsuper.clone();

  14. }

  15. }

克隆的调用:

Java代码

  1. publicstaticvoidmain(String[] args) {

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

  3. try{

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

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

  6. catch(CloneNotSupportedException e) {

  7. e.printStackTrace();

  8. }

  9. }

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

技术分享:www.kaige123.com

以上是关于java对象比较器和克隆的主要内容,如果未能解决你的问题,请参考以下文章

Java 克隆

JavaSE系列趁着跨年的时间,学会了Java中常用的比较器和克隆接口

java对象的克隆

java中的浅克隆和深克隆是啥

java常用类

java中深克隆与浅克隆的区别