博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java对象比较器和克隆
阅读量:6245 次
发布时间:2019-06-22

本文共 3576 字,大约阅读时间需要 11 分钟。

hot3.png

  • 一.比较器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;

  •  
  • }

  •  
  • }

  •   程序运行结果:
  •   
  •   我们发现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("\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 + "]";

  • }

  •  
  • }

  •   运行结果:
  •   
  •   为自定义的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创建好一些。
  •                                                                                                                                           技术分享:凯哥学堂

转载于:https://my.oschina.net/kaige123/blog/734842

你可能感兴趣的文章
KVM虚拟化开源高可用方案(三)glusterfs
查看>>
linux中date的用法总结
查看>>
在互联网时代不突破的企业将没有出路
查看>>
linux下新加硬盘
查看>>
Day03 - 挂载、nmcli、yum安装
查看>>
Linux下的qperf测量网络带宽和延迟
查看>>
wxPython 配置环境
查看>>
C的数据类型 关键字
查看>>
Hadoop 2.5.2 HDFS HA+YARN HA 应用配置
查看>>
tomcat远程调试
查看>>
APUE读书笔记-18终端输入输出-05终端选项标记
查看>>
Linux查看系统IO
查看>>
阅后即焚,Python 运维开发99速成
查看>>
Oracle正则表达式(二)
查看>>
oracle导入导出
查看>>
刘宇凡:360搜索来了,百度你怂了吗?
查看>>
windows通配符
查看>>
Linux学习之路-Linux-内部yum配置及hostname修改【11】---20171226
查看>>
详解CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI区别
查看>>
针对ASP.NET页面实时进行GZIP压缩优化的几款压缩模块的使用简介及应用测试!(附源码)...
查看>>