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中传递和返回对象的实例代码
-
原来PHP的面向对象和java差不多啊解决办法
-
Java8比较器-如何对List排序详解
-
Java之反射第十八天( --反射----类的加载--获取对象属性( 成员变量和方法)-- 构造方法 )
-
Java 中Comparable和Comparator区别比较
-
java web学习_浅谈request对象中get和post的差异
-
java 使用ConcurrentHashMap和计数器实现锁
-
PHP动态地创建属性和方法, 对象的复制, 对象的比较,加载指定的文件,自动加载类文件,命名空间
-
基于Java class对象说明、Java 静态变量声明和赋值说明(详解)
-
详解Java对象的强、软、弱和虚引用+ReferenceQueue