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

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基础知识索引

    可以通过实现`Cloneable`接口并重写`clone`方法来实现对象的克隆。 #### 字符串类 - **String**:不可变字符串类。 - **StringBuilder/StringBuffer**:可变字符串类,其中`StringBuilder`是非线程安全的,而`...

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

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

    2021 java面试题.pdf

    Java中的克隆分为浅克隆和深克隆,浅克隆只复制对象本身,深克隆会复制对象及其引用的所有子对象。 new一个对象涉及类加载、实例化和初始化,而clone则是复制一个现有对象,两者在内存分配上有显著区别。 多态是...

    Java面试八股文2024最新版

    1. **Java语言特点**:包括跨平台性、面向对象、自动内存管理、丰富的类库、健壮性和安全性等。 2. **面向对象与面向过程**:面向对象编程注重对象和类的抽象,而面向过程编程关注步骤和函数。 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必须知道的一些问题,入门必备

    在 Java 中,对象通过 `new` 关键字创建,使用完成后由垃圾回收器自动回收。 6. **类与包**: - Java 使用包来组织类和接口,常见的包如 `java.lang`、`java.util`、`java.net` 等。合理使用包可以避免命名冲突,...

    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基础难点-更新版

    * 对象的 finalize() 方法可以请求垃圾回收器进行回收 5. 克隆: * 简单克隆可以使用 clone() 方法,但是需要实现 Cloneable 接口 * 深度克隆需要重新克隆对象的属性 6. 字符串: * 字符串会被 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 ...

    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_lang包详解.pdf

    Cloneable接口表示对象可以被克隆,Comparable接口则允许类的对象进行比较排序。 java.lang包还包含了一些与安全、线程和内存管理相关的类,如SecurityManager用于安全管理,Thread和ThreadGroup是线程相关的类,...

    李兴华java1.8视频笔记

    - 比较器:包括Comparable接口和Comparator接口,用于对象比较的两种不同方式。 - 正则表达式:提供了一种文本模式的描述方法,可用于搜索和替换文本。 反射机制是Java语言提供的一种基础功能,通过反射机制可以...

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

    精品专题(2021-2022年收藏)Java语言与面向对象程序设计在线作业F答案.docx

    `Object`类描述了Java对象的基本特征,包括对象的比较、克隆和字符串表示等。面向对象的三大特性——封装、继承和多态,都是基于类和对象的。 15. **Scanner类**: `Scanner`类是Java的输入工具,可以从`System....

    Java util

    - `ArrayList`、`LinkedList`、`HashSet`、`HashMap`等都实现了`Cloneable`和`Serializable`接口,可以进行克隆和序列化。 2. **日期和时间处理**: - `Date`类:表示特定瞬间,精确到毫秒。但在Java 8之后,已经...

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

Global site tag (gtag.js) - Google Analytics