`
hm4123660
  • 浏览: 277940 次
  • 性别: Icon_minigender_1
  • 来自: 广州
博客专栏
Dea4ce76-f328-3ab2-b24a-fb268e1eeb75
数据结构
浏览量:68980
社区版块
存档分类
最新评论

java对象比较器和克隆

    博客分类:
  • Java
阅读更多

     

 一.比较器Comparable和Comparator 

           上一篇博客介绍了工具类Arrays工具类 。我们可以对基本类型的数组调用Arrays.sort()函数来进行数组的排序。排序操作在日常开发中经常要使用到。那么String类和自定义类能不能使用Arrays.sort()来进行排序呢。下面我们来试试,如下:

public class Mystring {
	
	public static void main(String[] args) {
		
	   String []a={"早上","中午","下午","傍晚","晚上"};
	   
	   Person[] b={ new Person("小白",15),new Person("小黑",19),
			        new Person("小红",14),new Person("小紫",20)};   
	   Arrays.sort(a);
	   for(int i=0;i<a.length;i++)
		   System.out.print(a[i]);
	   System.out.print("\r\n");
	   
	   Arrays.sort(b);
	   for(int i=0;i<b.length;i++)
		   System.out.println(b[i]);
	}
	
}
//自定义类
class Person {
	
	public String name;
	
	public int age;	

	public Person(String name,int age) {
		this.name=name;
		this.age=age;
		
	}

}

 

程序运行结果:



 

我们发现String可以调用Arrays.sort()函数,而我们自定义的Person类报错,看错误的关键字 Comparable

打开String源码



 

    由此引入比较器Comparable,我们下面利用Comparable接口来实现Person使用Arrays.sort()按年龄排序递增排序。

    Comparable接口能够对实现它的类的对象进行排序,主要使用compareTo函数来实现排序。compareTo函数返回int类型,分别返回-1,0,1对应小于,等于,大于。

 

  把代码改为:

 

public class Mystring {
	
	public static void main(String[] args) {
		
	   String []a={"早上","中午","下午","傍晚","晚上"};
	   
	   Person[] b={ new Person("小白",15),new Person("小黑",19),
			        new Person("小红",14),new Person("小紫",20)};   
	   Arrays.sort(a);
	   for(int i=0;i<a.length;i++)
		   System.out.print(a[i]);
	   System.out.print("\r\n");
	   
	   Arrays.sort(b);
	   for(int i=0;i<b.length;i++)
		   System.out.println(b[i]);
	}
	
}
//自定义类
class Person implements Comparable<Person>{
	
	public String name;
	
	public int age;	

	public Person(String name,int age) {
		this.name=name;
		this.age=age;
		
	}
    //比较器的比较函数
	/**
	 * 如果当前对象小于比较对象,返回-1
	 * 如果当前对象等于比较对象,返回0
	 * 如果当前对象大于比较对象,返回1
	 */
	@Override
	public int compareTo(Person o) {
		//对象为空,抛出空指针异常
		if(o==null)
			throw new NullPointerException();
		if(this.age<o.age)
			return -1;
		if(this.age>o.age)
			return 1;
		return 0;
	}
	//重写toString方法
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}

}

 运行结果:



 

为自定义的Person实现比较器Comparable接口,即可调用Arrays.sort()进行排序。

 

另外还有另一种实现方法,实现Comparator接口。

public class Mystring {
	
	public static void main(String[] args) {
		
	   String []a={"早上","中午","下午","傍晚","晚上"};
	   
	   Person[] b={ new Person("小白",15),new Person("小黑",19),
			        new Person("小红",14),new Person("小紫",20)};   
	   Arrays.sort(a);
	   for(int i=0;i<a.length;i++)
		   System.out.print(a[i]);
	   System.out.print("\r\n");
	   
	   Arrays.sort(b,new PersonComparator());
	   for(int i=0;i<b.length;i++)
		   System.out.println(b[i]);
	}
	
}
//自定义类
class Person {	
	public String name;
	
	public int age;	

	public Person(String name,int age) {
		this.name=name;
		this.age=age;
		
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}

}

class PersonComparator implements Comparator<Person>{

	 //比较器的比较函数
		/**
		 * 如果当前对象小于比较对象,返回-1
		 * 如果当前对象等于比较对象,返回0
		 * 如果当前对象大于比较对象,返回1
		 */
	@Override
	public int compare(Person o1, Person o2) {
		//对象为空,抛出空指针异常
		if(o1==null||o2==null)
			throw new NullPointerException();
		if(o1.age<o2.age)
			return -1;
		if(o1.age>o2.age)
			return 1;
		return 0;
	}
	
}

二.对象的克隆Clone

    将一个对象复制一份,称作对象的克隆技术。克隆对象分为两步。

 

1.实现Cloneable标记接口

       Cloneable是一个标记接口,此接口没有定义任何方法。只是作为一个标记给虚拟机。

2.重写Object的clone方法

//自定义类person实现Cloneable接口
class Person implements Cloneable {	
	public String name;
	
	public int age;	

	public Person(String name,int age) {
		this.name=name;
		this.age=age;
		
	}
    //重写Object的clone方法
	@Override
	protected Object clone() throws CloneNotSupportedException
	{
		return super.clone();
	}

}

 

克隆的调用:

public static void main(String[] args) {
		
	     Person temp=new Person("王尼玛",18);
	     
	     try {
			Person ok=(Person)temp.clone();//把Object类转化为Person、
			System.out.println(ok.name);//输出王尼玛
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
	
	}

 

     这样既可以完成对一个对象的克隆,当我们要创建一系列类似的对象时,可以考虑使用克隆技术可以得到更好的性能,比你new创建好一些

  • 大小: 21.5 KB
  • 大小: 8.7 KB
  • 大小: 7.9 KB
3
3
分享到:
评论

相关推荐

    Java开发详解.zip

    031113_【第11章:Java常用类库】_比较器(Comparable、Comparator)笔记.pdf 031114_【第11章:Java常用类库】_观察者设计模式笔记.pdf 031115_【第11章:Java常用类库】_正则表达式笔记.pdf 031116_【第11章:Java...

    java 编程入门思考

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    Java经典编程源码基础例程300.zip

    实例056 Java对象的深克隆 82 实例057 序列化与对象克隆 84 实例058 深克隆效率的比较 87 第7章 面向对象进阶 89 实例059 经理与员工的差异 90 实例060 重写父类中的方法 92 实例061 计算几何图形的面积 93 实例062 ...

    Java初学者入门教学

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    java联想(中文)

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    JAVA_Thinking in Java

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    Thinking in Java简体中文(全)

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    Thinking in Java 中文第四版+习题答案

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 其他J/Direct...

    JAVA_Thinking in Java(中文版 由yyc,spirit整理).chm

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    Think in Java(中文版)chm格式

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调...

    Thinking in Java(中文版 由yyc,spirit整理).chm

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    高级开发jvm面试题和答案.pdf

    对象的浅克隆和深克隆; 类加载 类加载过程(类加载从磁盘上将字节码文件(.class文件)中的内容读入虚拟机,并保存起来) 类加载特性 ; 类加载的时机: 三种类加载器: 双亲委派机制概念; 怎么解决双亲委派机制; ...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例111 Java对象的深克隆 137 实例112 序列化与对象克隆 139 实例113 深克隆效率的比较 141 实例114 transient关键字的应用 143 5.7 接口和内部类 145 实例115 使用sort()方法排序 145 实例116 简化compareTo()方法...

    ThinkInJava

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    thinkinjava

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【基础】如何实现对象克隆? 27 【基础】Java序列化与反序列化 27 为什么需要序列化与反序列化 28 如何实现Java序列化与反序列化 28 【基础】String s = new String("xyz");创建了几个字符串对象 30 【基础】接口...

Global site tag (gtag.js) - Google Analytics