`
l4432848
  • 浏览: 253430 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java对象比较器和克隆

    博客分类:
  • 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创建好一些。

 

技术分享:凯哥学堂

0
1
分享到:
评论

相关推荐

    Java基础知识索引

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

    Java开发详解.zip

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

    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 编程入门思考

    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