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("\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创建好一些。 |
技术分享:凯哥学堂
java对象比较器和克隆的更多相关文章
- Java对象比较器对泛型List进行排序-Demo
针对形如:字段1 字段2 字段3 字段n 1 hello 26 7891 world 89 5562 what 55 4562 the 85 452 fuck 55 995 haha 98 455 以 ...
- JAVA对象的深度克隆
有时候,我们需要把对象A的所有值复制给对象B(B = A),但是这样用等号给赋值你会发现,当B中的某个对象值改变时,同时也会修改到A中相应对象的值! 也许你会说,用clone()不就行了?!你的想法只 ...
- JAVA笔记10__Math类、Random类、Arrays类/日期操作类/对象比较器/对象的克隆/二叉树
/** * Math类.Random类.Arrays类:具体查JAVA手册...... */ public class Main { public static void main(String[] ...
- Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨
Java对象克隆(Clone)及Cloneable接口.Serializable接口的深入探讨 Part I 没啥好说的,直接开始Part II吧. Part II 谈到了对象的克隆,就不得不说为什么 ...
- (转)Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨
原文地址:http://blog.csdn.net/kenthong/article/details/5758884 Part I 没啥好说的,直接开始Part II吧. Part II 谈到了对象的 ...
- 【JAVA零基础入门系列】Day14 Java对象的克隆
今天要介绍一个概念,对象的克隆.本篇有一定难度,请先做好心理准备.看不懂的话可以多看两遍,还是不懂的话,可以在下方留言,我会看情况进行修改和补充. 克隆,自然就是将对象重新复制一份,那为什么要用克隆呢 ...
- JAVA对象克隆可能会出现的问题
首先,区分一下拷贝和克隆: 拷贝:当拷贝一个变量时,原始变量与拷贝变量引用的是同一个对象.当改变一个变量所引用的对象,则会对另一个变量造成影响. 克隆:当克隆一个对象时,是重新的创建了和该对象内容相同 ...
- Java对象的克隆和深浅问题
Java实现克隆的方式 Java实现克隆的方式有如下两种, 推荐采用实现Cloneable接口的方式 实现Cloneable接口, 重写clone方法, 调用父类的clone方法 还有另一种方法, 不 ...
- Java对象和集合的拷贝/克隆/复制
昨天同事遇到了一个奇怪的问题,他需要将一个JavaBean拷贝一份,然后对新创建的Bean进行操作.但是他对新的Bean操作后,会影响旧的Bean的值.当听到这个问题的时候,我第一反应就是他的拷贝方法 ...
随机推荐
- July 21st, Week 30th Thursday, 2016
What youth deemed crystal, age finds out was dew. 年少时的水晶,在岁月看来不过是露珠. As time goes by, we are gradual ...
- javaweb实现验证码功能
在javaweb的用户注册与登陆功能时,有时为了防止漏洞或者大量注册,可以使用验证码功能,下面是验证码的一个简单实现 验证码类 public class ValiImg extends HttpSer ...
- Fresco 源码分析(一) DraweeView-DraweeHierarchy-DraweeController(MVC) DraweeView的分析
4. Fresco的内容 为了方便学习,我们先从使用结合官方的文档来分析 4.1 Fresco客户端的使用 在使用Fresco的使用,我们直接使用的是SimpleDraweeView这个类,然后在Ac ...
- 消息队列入门(三)JMS标准及实现
>>消息中间件 消息中间件即Message-oriented middleware(MOM),消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集 ...
- CI中PHP写法规范(不断更新)
1.类名首字母大写,多个单词用下划线连接,首字母小写是无效的 举例: class CI_Model 2.routes路由配置中的右侧在配置类名和方法名的时候都是小写,如果大写可能会出现404找不到的错 ...
- loj 1154(最大流+枚举汇点)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26868 思路:拆点,容量为最多能跳的步数,然后设立一个超级源点,源 ...
- Eclipse开发,利用WordWrap设置自动换行
安装 WordWrap : Help → install new Software→http://ahtik.com/eclipse-update/ 安装成功后,重启Eclipse,鼠标右键开启自动换 ...
- 垂直的SeekBar:VerticalSeekBar
public class VerticalSeekBar extends AbsSeekBar { private Drawable mThumb; public interface OnSeekBa ...
- 2016.6.17 kali Linux 隧道工具
隧道工具的基本概念: 1.在计算机网络中,隧道工具是指使用一种网络协议去封装另一种网络协议的技术. 2.通常用来数据伪装或者穿越防火墙,在入侵目标系统后,可用来提升权限和权限维持. Kali中的隧道工 ...
- Xamarin如何生成Android项目的APK
Xamarin如何生成Android项目的APK 首先需要选择Release模式生成项目.然后从“生成”菜单中选择Export Android Package命令,就可以导出APK包.APK保存在An ...


