`

深入 JAVA对象的复制与比较

阅读更多

1.对象的复制

2.clone()的使用

3.对象实例的比较

////////////////////

//

/////////////////////

1.对象的复制

  1. Stringstr1="Thisisastring!"//这里是"对象引用"的复制
  2. Stringstr2=newString(str1);//这里是"对象实例"的复制

浅复制:只复制复合对象本身.

深复制:除了复制复合对象本身,还复制了复合对象的引用的对象实例.

例如:

  1. classPupil{
  2. publicPupil(Stringsno,Stringname,intage){
  3. this.sno=newString(sno);
  4. this.name=newString(name);
  5. this.age=age;
  6. }
  7. publicStringgetSno(){
  8. returnsno;
  9. }
  10. publicStringgetName(){
  11. returnname;
  12. }
  13. publicintgetAge(){
  14. returnage;
  15. }
  16. publicvoidsetAge(intage){
  17. this.age=age;
  18. }
  19. privateStringsno;
  20. privateStringname;
  21. privateintage;
  22. }
  23. publicclassCopyDemo{
  24. publicstaticPupil[]shallowCopy(Pupil[]aClass){
  25. Pupil[]newClass=newPupil[aClass.length];
  26. //此时newClass与aClass指向同一块内存
  27. for(inti=0;i<aClass.length;i++)
  28. newClass[i]=aClass[i];
  29. returnnewClass;
  30. }
  31. publicstaticPupil[]deepCopy(Pupil[]aClass){
  32. Pupil[]newClass=newPupil[aClass.length];
  33. //此时newClass与aClass的相应sno,name指向同一块内存
  34. for(inti=0;i<aClass.length;i++){
  35. Stringsno=aClass[i].getSno();
  36. Stringname=aClass[i].getName();
  37. intage=aClass[i].getAge();
  38. newClass[i]=newPupil(sno,name,age);
  39. }
  40. returnnewClass;
  41. }
  42. publicstaticPupil[]deeperCopy(Pupil[]aClass){
  43. Pupil[]newClass=newPupil[aClass.length];
  44. //完全的复制
  45. for(inti=0;i<aClass.length;i++){
  46. Stringsno=newString(aClass[i].getSno());
  47. Stringname=newString(aClass[i].getName());
  48. intage=aClass[i].getAge();
  49. newClass[i]=newPupil(sno,name,age);
  50. }
  51. returnnewClass;
  52. }
  53. }

2.clone()的使用

*Object.clone()

*Cloneable接口

*CloneNotSupportedException

a.使用Object.clone进行复制

两个必须条件:

1.一定要将重定义后的clone()方法定义为公有方法(在Object类中,它是受保护的成员,不能直接使用)

2.该后代类声明实现接口Cloneable接口(当类实现该接口,其任何子类也会继承该接口),该接口实际上没有任何

内容,只是一个标识,标志实现该接口的类提供clone()方法.(这是接口的一种非典型用法)

  1. publicclassFractionimplementsCloneable{
  2. publicObjectclone(){
  3. try{
  4. returnsuper.clone();//callprotectedmethod
  5. }catch(CloneNotSupportedExceptione){
  6. returnnull;
  7. }
  8. }
  9. //othermethods...
  10. }

b.重写Object.clone()

例如对privatechar[]cb;characterbuffer进行复制

  1. //addinclassCirbuf
  2. publicObjectclone(){
  3. try{
  4. Cirbufcopy=(Cirbuf)super.clone();
  5. copy.cb=(char[])cb.clone();
  6. returncopy;
  7. }catch(CloneNotSupportedExceptione){
  8. thrownewInternalError(e.toString());
  9. }
  10. }

c.复制数组

数组是在方法调用重以引用的形式传递的对象.下述情况下非常适合引用来传递数组:

*正在接收的方法不修改数组

*正在调用的方法不必关心是否修改数组

*正在调用的方法想要得到数组中的修改结果

否则,就应该在方法调用中传递数组对象的副本.只需调用arrObj.clone()方法即可完成数组arrObj的复制操作.随后将该数组副本强制转换为其正确类型:

(type[])arrObj.clone();

System.arraycopy方法提供一种用于在数组间复制多个元素的有效方式.

System.arraycopy(source,i,target,j,len)

3.对象实例的比较

例如:

  1. Pupilp1=newPupil("99184001","zhang3",18);
  2. Pupilp2=newPupil("99184001","zhang3",18);

a."=="

if(p1==p2)...

此次测试的是对象引用,其结果肯定是false,只要两个对象引用不是互为别名就不会相等.

b.浅比较false

  1. if(p1.getSno()==p2.getSno()&&p1.getName()==p2.getName()
  2. &&p1.getAge()==p2.getAge())...;

c.深比较true[/code]

if(p1.getSno().equals(p2.getSno())&&p1.getName().equals(p2.getName())

&&p1.getAge()==p2.getAge())...;[/code]

JAVAAPI的跟类Object也提供了equals()方法,但它只是比较两个对象引用,而非比较两个对象实例.

不管怎样,如果需要比较Pupil类的对象(例如要将它们放入对象容器),应该为Pupil类重定义equals()方法:

  1. publicbooleanequals(Objectotherobj){
  2. //检查otherobj是否为空
  3. if(otherobj==null)returnfalse;
  4. //检查otherobj是否就是当前对象
  5. if(otherobj==this)returntrue;
  6. //检查otherobj是否具有正确的类型,即检查是否可与当前对象比较
  7. if(!(otherobjinstanceofPupil))returnfalse;
  8. //将otherobj转换为Pupil类的对象引用
  9. PupiltmpObj=(Pupil)otherobj;
  10. //关于学生是否相等的逻辑检查
  11. if(sno.equals(tmpObj.sno)&&name.equals(tmpObj.name)
  12. &&age==tmpObj.age)returntrue;
  13. returnfalse;
  14. }

JAVAAPI所提供的每个类几乎都提供了采用深比较策略的equals()方法,例如String类equals()方法.一般来说,用户自己定义的类也应当提供合适的equals()方法,特别是当程序要将其对象放入JAVAAPI所提供的对象容器类的时候.

按照约定,任何类所提供的equals()方法所实现的相等比较应该是等价关系,即满足自反性,对称性和传递性.另外一个类重定义了equals()方法,也应该重定义相应hashCode()方法,否则将这个类的对象放入映射对象容器时也会发生以外.

分享到:
评论

相关推荐

    java不同对象及集合的多次复制

    在Java编程中,对象复制是一项常见的任务,特别是在处理模型(Model)和视图对象(VO)时。模型对象通常用于封装业务数据,而视图对象则用于展示这些数据。值复制,即对象属性值的复制,是保持数据一致性和简化代码...

    编程语言java对象复制.pdf

    在标题“编程语言java对象复制.pdf”和描述“编程语言java对象复制.pdf”中,明确指出了文档的主题是关于Java编程语言中对象复制的技术知识。在给出的内容部分中,通过具体的Java代码示例,讨论了在Java中实现对象...

    深入java虚拟机.pdf

    深入 Java 虚拟机.pdf Java 虚拟机(Java Virtual Machine,JVM)是 Java 语言的 runtime 环境,是 Java 程序执行的核心组件。它提供了一个平台无关的环境,允许 Java 程序在不同的操作系统和硬件平台上运行。 一...

    java对象复制[参考].pdf

    本文将深入探讨Java对象复制,特别是通过`clone()`方法实现的复制。 首先,我们来理解什么是对象复制。对象复制是指创建一个新对象,这个新对象与原对象具有相同的属性值。在Java中,基础类型(如int、double等)是...

    java类复制一个持久化对象

    在Java编程语言中,对象复制是一项常见的操作,尤其是在处理持久化对象时,为了保持数据的一致性和完整性,正确地复制对象变得尤为重要。本文将深入探讨如何利用反射机制在Java中复制一个持久化对象,理解其背后的...

    深入Java对象及元素的存储区域

    ### 深入Java对象及元素的存储区域 在Java平台进行软件开发的过程中,一个显著的特点是对象的创建是在程序运行时动态发生的。这也就意味着,直到程序执行时才能最终确定对象应该存放在哪个内存区域。不同的存储区域...

    JAVA_对象克隆

    本文将深入探讨Java中的对象克隆,包括其原理、实现方式以及注意事项。 一、对象克隆的原理 在Java中,对象克隆可以通过实现`Cloneable`接口并覆盖`Object`类中的`clone()`方法来完成。`Cloneable`接口本身不包含...

    深入JAVA虚拟机 随书源码 JVM规范

    首先,我们来看《深入JAVA虚拟机》这本书,它涵盖了JVM的各个关键方面,包括指令集、运行时数据区、方法区、堆内存、栈帧结构、编译与优化、异常处理和安全性等。书中通过实例解析,帮助读者理解JVM如何处理Java程序...

    深入java对象复制的分析

    Java对象复制是一个重要的概念,它涉及到对象的深拷贝和浅拷贝,以及如何通过不同的方式来实现对象的复制。本文将深入分析Java中的对象复制,主要包括两种常见方法:使用`clone()`方法和通过反射机制。 1. **Object...

    拷贝JSON对象值进Java Bean对象

    在Java编程中,将JSON对象转换为Java Bean对象是一个常见的任务,特别是在处理Web服务或API交互时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,而Java Bean是符合特定规范的Java类,通常用于...

    深入JAVA虚拟机第二版 Bill Venners著 曹晓钢 蒋靖译

    《深入JAVA虚拟机第二版》是由Bill Venners撰写,并由曹晓钢和蒋靖翻译的中文书籍。这本书是Java开发者必备的经典读物,它详细地解析了Java虚拟机(JVM)的工作原理,帮助读者深入理解Java程序的运行机制。尽管描述...

    java文件复制,实现文件的复制

    本文将深入探讨如何使用Java实现文件及其目录结构的完整复制。 #### 一、基础知识回顾 在进行文件复制之前,我们先回顾一下Java中处理文件的基本概念: 1. **`java.io.File`**:用于表示文件或目录路径,可以获取...

    深入java虚拟机 中文版 pdf

    《深入Java虚拟机》这本书是IT领域中关于Java虚拟机(JVM)的深度解析之作,主要聚焦于JVM的工作原理、内部结构以及优化技巧。Java虚拟机作为Java语言的核心组件,其性能直接影响到Java应用程序的运行效率。因此,对...

    对象数组 java

    - 和所有Java对象一样,对象数组的元素也会在垃圾收集器的作用下自动释放内存,只要没有其他引用指向这些对象。 以上内容详细介绍了Java中对象数组的基本概念、创建、初始化、访问、修改以及与其他数据结构的比较...

    深入Java虚拟机

    深入Java虚拟机不仅有助于理解代码如何在JVM上运行,还能帮助我们优化程序性能,减少内存泄漏,提高并发能力,甚至编写更高效、安全的Java代码。通过对JVM的深入学习,开发者可以解决实际开发中的各种问题,提升自己...

    think in java 第11章 持有对象

    以上就是《Think in Java》第11章“持有对象”中的核心知识点,理解并掌握这些概念对于深入理解和使用Java对象是非常重要的。通过实践和编程练习,你可以更好地领悟这些知识,并应用到实际项目中。

    深入java虚拟机第二版随书光盘

    《深入Java虚拟机第二版》是一本深受Java开发者喜爱的经典著作,它详尽地剖析了Java虚拟机(JVM)的工作原理,为程序员提供了深入了解Java平台核心机制的机会。随书光盘包含了书中提及的各种示例代码、实验数据以及...

    java对象引用易混解析

    #### 四、引用的复制与对象的传递 - **引用复制**: - 当执行如 `veh2 = veh1;` 的操作时,实际上是将 `veh1` 所指向的对象地址复制给了 `veh2`,而不是复制了对象本身。这意味着 `veh1` 和 `veh2` 都指向了同一个...

    Java深复制与浅复制&Clone

    在Java编程语言中,对象复制是一个常见的操作,用于创建一个现有对象的新副本。有两种主要的复制方式:浅复制(Shallow Copy)和深复制(Deep Copy)。这两种复制方法在处理对象时有不同的行为和应用场景,特别是在...

    深入JAVA虚拟机 不那么完美的第二版.pdf.zip

    《深入JAVA虚拟机 不那么完美的第二版》这本书虽然在印刷上可能存在一些小瑕疵,但这并不影响我们从中汲取宝贵的Java虚拟机(JVM)知识。Java虚拟机是Java平台的核心组成部分,它负责执行Java程序,提供了跨平台的...

Global site tag (gtag.js) - Google Analytics