一.比较器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创建好一些。 |
技术分享:凯哥学堂