一.比较器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对象比较器和克隆的更多相关文章

  1. 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 以 ...

  2. JAVA对象的深度克隆

    有时候,我们需要把对象A的所有值复制给对象B(B = A),但是这样用等号给赋值你会发现,当B中的某个对象值改变时,同时也会修改到A中相应对象的值! 也许你会说,用clone()不就行了?!你的想法只 ...

  3. JAVA笔记10__Math类、Random类、Arrays类/日期操作类/对象比较器/对象的克隆/二叉树

    /** * Math类.Random类.Arrays类:具体查JAVA手册...... */ public class Main { public static void main(String[] ...

  4. Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨

    Java对象克隆(Clone)及Cloneable接口.Serializable接口的深入探讨 Part I 没啥好说的,直接开始Part II吧. Part II 谈到了对象的克隆,就不得不说为什么 ...

  5. (转)Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨

    原文地址:http://blog.csdn.net/kenthong/article/details/5758884 Part I 没啥好说的,直接开始Part II吧. Part II 谈到了对象的 ...

  6. 【JAVA零基础入门系列】Day14 Java对象的克隆

    今天要介绍一个概念,对象的克隆.本篇有一定难度,请先做好心理准备.看不懂的话可以多看两遍,还是不懂的话,可以在下方留言,我会看情况进行修改和补充. 克隆,自然就是将对象重新复制一份,那为什么要用克隆呢 ...

  7. JAVA对象克隆可能会出现的问题

    首先,区分一下拷贝和克隆: 拷贝:当拷贝一个变量时,原始变量与拷贝变量引用的是同一个对象.当改变一个变量所引用的对象,则会对另一个变量造成影响. 克隆:当克隆一个对象时,是重新的创建了和该对象内容相同 ...

  8. Java对象的克隆和深浅问题

    Java实现克隆的方式 Java实现克隆的方式有如下两种, 推荐采用实现Cloneable接口的方式 实现Cloneable接口, 重写clone方法, 调用父类的clone方法 还有另一种方法, 不 ...

  9. Java对象和集合的拷贝/克隆/复制

    昨天同事遇到了一个奇怪的问题,他需要将一个JavaBean拷贝一份,然后对新创建的Bean进行操作.但是他对新的Bean操作后,会影响旧的Bean的值.当听到这个问题的时候,我第一反应就是他的拷贝方法 ...

随机推荐

  1. 转圈游戏(codevs 3285)

    题目描述 Description n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏.按照顺时针方向给 n 个位置编号,从0 到 n-1.最初,第 0 号小伙伴在第 0 号位置,第 1 号小伙伴在第 ...

  2. Android手势锁实现

    最终效果如下 整体思路 a.自定义了一个RelativeLayout(GestureLockViewGroup)在里面会根据传入的每行的个数,生成多个GestureLockView(就是上面一个个小圈 ...

  3. transient关键字使用笔记

    >>transient的作用及使用方法 一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过 ...

  4. 2.Abstract Factory 抽象工厂(创建型模式)之简单工厂

    简单工厂 1.只有一个工厂(具体的,没有抽象) 2.只生产一种产品(抽象的产品) 3.这种产品可以有多种具体产品类型(派生) 代码实现 class Program { static void Main ...

  5. 蓝牙4.0——Android BLE开发官方文档翻译

    ble4.0开发整理资料_百度文库 http://wenku.baidu.com/link?url=ZYix8_obOT37JUQyFv-t9Y0Sv7SPCIfmc5QwjW-aifxA8WJ4iW ...

  6. [译] Web API 之 简介

    事实上,MVC 框架本身已经提供了构建REST风格服务的基础,而Web API 只是让你可以更加容易和快捷的构建REST服务. 特性 基于约定的 CRUD Actions: 自动按照HTTP的acto ...

  7. Dos del参数与作用(/f/s/q)

    Dos del参数与作用(/f/s/q) C:\Documents and Settings>del /? 删除一个或数个文件. DEL [/P] [/F] [/S] [/Q] [/A[[:]a ...

  8. Animator窗口视图Project视图PlayerIdleAnimation和PlayerWalkingAnimation

    Animator窗口视图Project视图PlayerIdleAnimation和PlayerWalkingAnimation 通过上一小节的操作,我们新建了2个动画:PlayerIdleAnimat ...

  9. 简单几何(线段相交) POJ 2653 Pick-up sticks

    题目传送门 题意:就是小时候玩的一种游戏,问有多少线段盖在最上面 分析:简单线段相交,队列维护当前最上的线段 /******************************************** ...

  10. Big Event in HDU[HDU1171]

    Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...