java对象比较器和克隆_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > java对象比较器和克隆

java对象比较器和克隆

 2015/4/11 3:20:58  hm4123660  程序员俱乐部  我要评论(0)
  • 摘要:一.比较器Comparable和Comparator上一篇博客介绍了工具类Arrays工具类。我们可以对基本类型的数组调用Arrays.sort()函数来进行数组的排序。排序操作在日常开发中经常要使用到。那么String类和自定义类能不能使用Arrays.sort()来进行排序呢。下面我们来试试,如下:publicclassMystring{publicstaticvoidmain(String[]args){String[]a={"早上","中午","下午","傍晚","晚上"}
  • 标签:Java

?????

?一.比较器Comparable和Comparator?

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

class="java" name="code">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
  • 查看图片附件
上一篇: PHP开发学习笔记 下一篇: 没有下一篇了!
发表评论
用户名: 匿名