- 浏览: 531140 次
- 性别:
- 来自: 西安
文章分类
- 全部博客 (233)
- 设计模式 (1)
- WEBLOGIC (2)
- spring (2)
- struts (1)
- hibernate (8)
- SOA (11)
- j2ee (0)
- corba (0)
- linux (2)
- oracle (0)
- webService (17)
- javaMail (1)
- junit (3)
- java (45)
- 正则表达式 (7)
- java+xml (4)
- html (2)
- javaScript (6)
- ajax (1)
- mysql (0)
- eclipse (2)
- eclipse插件开发 (3)
- 软件工程 (5)
- ant (6)
- 开源包 (6)
- 学习网站 (7)
- Struts2 (18)
- JSP (1)
- 持续集成 (4)
- FreeMaker (6)
- 工作项目点点 (4)
- Maven2 (6)
- JQuery (1)
- 日志记录 (9)
- 工作流 (4)
- BPEL (1)
- extJs (1)
- 组件 (1)
- OSGI (10)
- ESB总线学习 (1)
- 错误解决 (2)
- JMX (3)
- 网络知识 (1)
最新评论
-
duanlongk:
这个问题解决了么?
java.lang.NoClassDefFoundError: org/apache/tuscany -
sotrip:
从上面结果来看,HelloWorld.class是由虚拟机的内 ...
如何实现自己的classloader -
zengsir2008:
哎,不太明白。。。。
OSGI DS 实例 -
ralfsumahe:
...
使用XFire开发Web Service客户端完整入门教程 -
liuqiao_0702:
...
osgi spring hibernate =
1.对象的复制
2.clone()的使用
3.对象实例的比较
////////////////////
//
/////////////////////
1.对象的复制
浅复制: 只复制复合对象本身.
深复制: 除了复制复合对象本身, 还复制了复合对象的引用的对象实例.
例如:
- class Pupil{
- public Pupil(String sno, String name, int age){
- this.sno = new String(sno);
- this.name = new String(name);
- this.age = age;
- }
- public String getSno() {
- return sno;
- }
- public String getName() {
- return name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- private String sno;
- private String name;
- private int age;
- }
- public class CopyDemo {
- public static Pupil[] shallowCopy(Pupil[] aClass) {
- Pupil[] newClass = new Pupil[aClass.length];
- //此时newClass 与aClass 指向同一块内存
- for(int i=0; i<aClass.length; i++)
- newClass[i] = aClass[i];
- return newClass;
- }
- public static Pupil[] deepCopy(Pupil[] aClass) {
- Pupil[] newClass = new Pupil[aClass.length];
- //此时newClass 与aClass 的相应sno , name 指向同一块内存
- for(int i=0; i<aClass.length; i++) {
- String sno = aClass[i].getSno();
- String name = aClass[i].getName();
- int age = aClass[i].getAge();
- newClass[i] = new Pupil(sno, name, age);
- }
- return newClass;
- }
- public static Pupil[] deeperCopy(Pupil[] aClass) {
- Pupil[] newClass = new Pupil[aClass.length];
- //完全的复制
- for(int i=0; i<aClass.length; i++) {
- String sno = new String(aClass[i].getSno());
- String name = new String(aClass[i].getName());
- int age = aClass[i].getAge();
- newClass[i] = new Pupil(sno, name, age);
- }
- return newClass;
- }
- }
2.clone()的使用
* Object.clone()
* Cloneable 接口
* CloneNotSupportedException
a. 使用Object.clone 进行复制
两个必须条件:
1.一定要将重定义后的clone() 方法定义为公有方法(在Object 类中, 它是受保护的成员, 不能直接使用)
2.该后代类声明实现接口 Cloneable 接口(当类实现该接口, 其任何子类也会继承该接口), 该接口实际上没有任何
内容, 只是一个标识, 标志实现该接口的类提供clone() 方法.(这是接口的一种非典型用法)
- public class Fraction implements Cloneable {
- public Object clone() {
- try{
- return super.clone(); //call protected method
- } catch (CloneNotSupportedException e) {
- return null;
- }
- }
- //other methods ...
- }
b.重写Object.clone()
例如对 private char[] cb; character buffer 进行复制
- // add in class Cirbuf
- public Object clone() {
- try{
- Cirbuf copy = (Cirbuf)super.clone();
- copy.cb = (char[])cb.clone();
- return copy;
- }catch (CloneNotSupportedException e){
- throw new InternalError(e.toString());
- }
- }
c.复制数组
数组是在方法调用重以引用的形式传递的对象. 下述情况下非常适合引用来传递数组:
*正在接收的方法不修改数组
*正在调用的方法不必关心是否修改数组
*正在调用的方法想要得到数组中的修改结果
否则, 就应该在方法调用中传递数组对象的副本. 只需调用 arrObj.clone() 方法即可完成数组arrObj 的复制操作. 随后将该数组副本强制转换为其正确类型:
(type[])arrObj.clone();
System.arraycopy 方法提供一种用于在数组间复制多个元素的有效方式.
System.arraycopy(source, i, target, j, len)
3.对象实例的比较
例如:
- Pupil p1 = new Pupil("99184001", "zhang3", 18);
- Pupil p2 = new Pupil("99184001", "zhang3", 18);
a. "=="
if(p1 == p2)...
此次测试的是对象引用, 其结果肯定是false, 只要两个对象引用不是互为别名就不会相等.
b. 浅比较 false
- if(p1.getSno() == p2.getSno() && p1.getName() == p2.getName()
- && p1.getAge() == p2.getAge()) ...;
c. 深比较 true[/code]
if(p1.getSno().equals(p2.getSno()) && p1.getName().equals(p2.getName())
&& p1.getAge() == p2.getAge()) ...;[/code]
JAVA API 的跟类Object 也提供了equals() 方法, 但它只是比较两个对象引用, 而非比较两个对象实例.
不管怎样, 如果需要比较Pupil 类的对象(例如要将它们放入对象容器), 应该为Pupil 类重定义equals() 方法:
- public boolean equals(Object otherobj) {
- //检查otherobj 是否为空
- if(otherobj == null) return false;
- //检查otherobj 是否就是当前对象
- if(otherobj == this) return true;
- //检查otherobj 是否具有正确的类型, 即检查是否可与当前对象比较
- if(!(otherobj instanceof Pupil)) return false;
- //将otherobj 转换为Pupil 类的对象引用
- Pupil tmpObj = (Pupil)otherobj;
- //关于学生是否相等的逻辑检查
- if(sno.equals(tmpObj.sno) && name.equals(tmpObj.name)
- && age == tmpObj.age) return true;
- return false;
- }
JAVA API 所提供的每个类几乎都提供了采用深比较策略的equals() 方法, 例如String 类equals() 方法. 一般来说, 用户自己定义的类也应当提供合适的equals() 方法, 特别是当程序要将其对象放入JAVA API 所提供的对象容器类的时候.
按照约定, 任何类所提供的equals() 方法所实现的相等比较应该是等价关系, 即满足自反性, 对称性和传递性. 另外一个类重定义了equals() 方法, 也应该重定义相应hashCode() 方法, 否则将这个类的对象放入映射对象容器时也会发生以外.
发表评论
-
类加载机制转载
2009-06-23 09:58 2340Java中一共有四个类加载器,之所以叫类加载器,是程序要用到某 ... -
OSGI环境下配置log4j日志
2009-05-07 14:07 1405log4j相信大家都用过的 ... -
Java虚拟机类装载:原理、实现与应用
2009-05-07 09:50 1493Java虚拟机类装载:原理、实现与应用 By jo ... -
Java程序类加载完全揭密
2009-05-07 09:49 1075Java程序类加载完全揭密 ... -
Java的类装载器(Class Loader)和命名空间(NameSpace)
2009-05-07 09:48 1731Java的类装载器(Class Loader)和命名空间(Na ... -
Java类装载体系中的隔离性
2009-05-07 09:28 1401Java类装载体系中的隔离性 正文 Java中类 ... -
了解 JAVA classloader
2009-05-07 09:21 1066什么是 ClassLoader? ... -
如何实现自己的classloader
2009-05-07 09:12 2023如何实现自己的classloader 如何实现自己的clas ... -
ClassLoader原理
2009-05-07 09:06 1003JVM规范定义了两种类型的类装载器:启动内装载器(bootst ... -
JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecuto
2009-04-03 11:32 1292在多线程大师Doug Lea的 ... -
MD5
2009-03-17 09:17 1004使用 Java 生成 MD5 编码 MD5即 ... -
JAVA字符串处理函数列表一览
2009-03-14 16:48 2010Java中的字符串也是一连串的字符。但是与许多其他的计算机语言 ... -
StringTokenizer(字符串分析解析类型)(转)
2009-03-14 16:35 3110功效:将字符串以定界符为界,分析为一个个的token(可理解为 ... -
JAVA乱码分析
2009-03-14 16:33 2148UNICODE编码,它采用双字 ... -
java.util.UUID
2008-12-19 18:01 4936GUID是一个128位长的数字,一般用16进制表示。算法的核心 ... -
java应用程序中动态生成PDF文件
2008-12-11 17:05 1166很多应用程序要求动态 ... -
JAVA和JAVAC 命令行
2008-12-11 17:03 2580javac和java命令行中的-classpath选项这是个很 ... -
创建java的可执行文件
2008-12-11 16:59 1369Jar工具的作用是java程序中若干文件联合压缩到一个Jar包 ... -
解析Java对象的equals()和hashCode()的使用
2008-12-04 10:07 847在Java语言中,equals()和h ... -
Java基础:深入 JAVA对象的复制与比较
2008-12-04 10:06 8581.对象的复制2.clone()的使用3.对象实例的比较/// ...
相关推荐
本书全面深入地剖析了面向对象的PHP编程与设计。首先介绍了PHP的OO特性,包括类声明、对象实例化、继承、方法与属性封装以及静态方法与属性、抽象类、接口、异常处理、对象克隆等高级主题。然后介绍了设计模式,阐述...
首先介绍了php的oo特性,包括类声明、对象实例化、继承、方法与属性封装以及静态方法与属性、抽象类、接口、异常处理、对象克隆等高级主题。然后介绍了设计模式,阐述了模式的概念,展示了如何在php中实现几个关键的...
首先介绍了php的oo特性,包括类声明、对象实例化、继承、方法与属性封装以及静态方法与属性、抽象类、接口、异常处理、对象克隆等高级主题。然后介绍了设计模式,阐述了模式的概念,展示了如何在php中实现几个关键的...
基本数据类型和数组都为真复制,即为真副本,当属性为对象时,为假复制,改变副本仍会影响原对象.解决方案: //在原对象中添加 function __clone(){ $this->对象 = clone $this->对象 } __clone在clone前自动触发,可以...
本篇文章是对JAVA对象深度克隆进行了详细的分析介绍,需要的朋友参考下
深度对象复制/比较/合并库。 npm install helms 用法 比较 compare(a: Any, b: Any) -> Boolean 对a与b进行深入比较。 它将在相同的指针和不相等的原型上短路,因此请注意,不同类上的相似属性不相等。 复制 copy...
JavaScript中并没有直接提供对象复制(Object Clone)的方法。因此下面的代码中改变对象b的时候,也就改变了对象a。 a = {k1:1, k2:2, k3:3}; b = a; b.k2 = 4; 如果只想改变b而保持a不变,就需要对对象a进行复制。 ...
本篇文章是对java对象复制进行了详细的分析介绍,需要的朋友参考下
《.NET深入体验与实战精要》作者身为从事.NET一线开发的资深开发专家,常年耕耘技术博客,惠及无数.NET新知。此次将长期的思考、感悟,多年的系统开发、设计和团队管理经验,以及深入分析众多项目实战的宝贵成果...
主要介绍了Java对象的克隆的相关资料,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
查看了很多文章对于clone()方法讲解都不慎透彻,特别是对于深层克隆的讲解语言晦涩难懂,很难理解,包括Oracle公司出版的JDK帮助文档也讲的不清楚,本人通过...并通过程序对比让大家能够更加深入了解深层克隆的内容。
复制初始化首先使用指定构造函数创建一个临时对象,然后用复制构造函数将那个临时对象复制到正在创建的对象” 还有一段这样说: “通常直接初始化和复制初始化仅在低级别优化上存在差异,然而,对于不支持复制的类型...
4.12.5 复制节点 134 4.12.6 输出格式化的数字 135 4.13 条件处理 144 4.13.1 [xsl:if] 144 4.13.2 [xsl:choose] 145 4.14 排序 146 4.15 变量和参数 150 4.15.1 变量 150 4.15.2 参数 152 4.16 命名模板 ...
这篇文章主要讲述XML与对象的序列化与反序列化。并且会附上一些简单的序列化与反序列化方法,供大家使用。假设我们在一个Web项目中有这样两个类复制代码 代码如下:public class Member { public string Num { get; ...
检查与进程、线程和作业相关的数据结构和算法;观察Windows如何管理虚拟内存和物理内存;理解NTFS的操作和格式,诊断文件系统访问问题;从上往下查看Windows的网络栈,包括映射、API、名称解析和协议驱动程序;诊断...
Python一切皆对象(object),每个对象都可能有多个属性(attribute)。Python的属性有一套统一的管理方案。 属性的__dict__系统 对象的属性可能来自于其类定义,叫做类属性(class attribute)。类属性可能来自类定义自身...
第31讲 深入理解对象的访问定位 00:08:01 第32讲 垃圾回收-概述 00:06:20 第33讲 垃圾回收-判断对象是否存活算法-引用计数法详解 00:14:08 第34讲 垃圾回收-判断对象是否存活算法-可达性分析法详解 00:...
4.12.5 复制节点 134 4.12.6 输出格式化的数字 135 4.13 条件处理 144 4.13.1 [xsl:if] 144 4.13.2 [xsl:choose] 145 4.14 排序 146 4.15 变量和参数 150 4.15.1 变量 150 4.15.2 参数 152 4.16 命名模板 ...
4.12.5 复制节点 134 4.12.6 输出格式化的数字 135 4.13 条件处理 144 4.13.1 [xsl:if] 144 4.13.2 [xsl:choose] 145 4.14 排序 146 4.15 变量和参数 150 4.15.1 变量 150 4.15.2 参数 152 4.16 命名模板 ...