JavaGeneralTechniques之EqualsMethodspecifica.ppt_第1页
JavaGeneralTechniques之EqualsMethodspecifica.ppt_第2页
JavaGeneralTechniques之EqualsMethodspecifica.ppt_第3页
JavaGeneralTechniques之EqualsMethodspecifica.ppt_第4页
JavaGeneralTechniques之EqualsMethodspecifica.ppt_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

General Techniques Equals Method specification Jessica Tang Dont put off till tomorrow what should be done today Opening _1 lString str1 = new String(“jessica“); lString str2 = new String(“jessica“); lif(str1.equals(str2) lSystem.out.println(“str1 equals str2!“); l lif(str1 = str2) lSystem.out.println(“str1 = str2“); lelse lSystem.out.println(“str1 != str2“); l Dont put off till tomorrow what should be done today Opening _2 Eg: EqualsTest2.java public class EqualsTest2 private int num = 0; private int age = 0; public EqualsTest2(int num, int age) this.num = num; this.age = age; public static void main(String args) EqualsTest2 a = new EqualsTest2(1,2); EqualsTest2 b = new EqualsTest2(1,2); EqualsTest2 c = a; if(a.equals(b) System.out.println(“a equals b!“); else System.out.println(“a doesnt equals b!“); if(a.equals(c) System.out.println(“a equals c!“); else System.out.println(“a doesnt equals c!“); Dont put off till tomorrow what should be done today 不要依赖equals()的缺省实现 lJava.lang.Object lpublic boolean equals(Object obj) return (this = obj); 对象只与本身相等 Dont put off till tomorrow what should be done today = 而在比较引用时,如果引用指向内存中的同一对 象,结果为true l注意点:大多数Java类库都实现了equals(),所以它实 际比较的是对象的内容,而非它们的句柄 例如,equals 方法(是String类从它的超类Object中继承的) 被用来检测两个对象是否相等,即两个对象的内容是否相等 。 Dont put off till tomorrow what should be done today Why Override Equals()? l尽管对象的内容相同,句柄却是不同的,而Object中 的Equals方法比较的正好就是对象句柄。 l思考: 若想对比两个对象的实际内容是否相同,又该如何 操作呢?此时,必须使用所有对象都适用的特殊方 法equals()。 Dont put off till tomorrow what should be done today Equals行事准则 l若要比较对象是否相等,其class有责任提供一个正确 的equals()。 l 在想当然耳地调用equals()之前,应先检查并确 保你所使用的class的确实现了equals()。 l 如果你所使用的class并未实现equals(),请判断 java.lang.Object的缺省函数码是否可胜任。 l 如果无法胜任,就应该在某个外覆类(wrapper class )或subclass中撰写你自己的equals()。 Dont put off till tomorrow what should be done today Equals规则 l1)自发性 x.equals(x)一定为true l2)对称性 x.equals(y)为true y.equals(x)也为true l3)传递性 x.equals(y) y.equals(z)为true,x.equals(z)也为 true l4)一致性 无论调用x.equals(y) 多少次,返回值都是相等的 l5)谨慎性 x.equals(null)一定返回false Dont put off till tomorrow what should be done today 如何覆盖Equals方法? lpublic boolean equals(Object o) lif (this = o) lreturn true; lif (o != null) lEqualsTest6 obj = (EqualsTest6) o; lreturn (obj.num = num) l l上述方法如何在equals()函数中使用getClass(),这种做法使得只 有隶属同一个class的对象才能被视为相等 Dont put off till tomorrow what should be done today 如何覆盖Equals方法? lpublic boolean equals(Object o) lif (this = o) lreturn true; lif (!(o instanceof EqualsTest1) lreturn false; lEqualsTest1 obj = (EqualsTest1) o; lreturn (obj.num = num) l l上述方法展示了派生类和基类 Dont put off till tomorrow what should be done today 如何覆盖Equals方法? l实现equals()时优先考虑使用getClass() 强型别自变量(strong argument)可以做到惟有相同class 所产生的对象才得被视为相等。进一步的推论就是:如果 两个对象隶属不同的classes或types,它们必不相等。 Eg: EqualsTest1.java l在equals()函数中谨慎使用instanceof derived class对象与其base class对象也可被视为相等 Eg: EqualsTest6.java, EqualsTest7.java Step1_3 Dont put off till tomorrow what should be done today l程序演示 Dont put off till tomorrow what should be done today Equals总结 l如果某个class的两个对象即使占据不同的内存空间,也可被视为 逻辑上相等的话,那么你得为这个class提供一个equals()。 请检查是否等于this。 比较这个class中的相关属性(值域, fields),以判断两个对象是 否相等。 如果有java.lang.Object以外的任何base class实现了equals(), 那么就应该调用super.equals() 。 l在equals()函数中面对getClass()和instanceof进行取舍时,你要仔细 斟酌以下问题: 如果只允许同一个class所产生的对象被视为相等,通常你应该使用 getClass() 。 只有在不得不对derived classes对象与base classes对象进行比较 的场合中,才可以使用instanceof,而且你应该明白这样做带来的可 能问题和复杂性。 如果使用instanceof,而且derived class和base class都实现有equals(), 你一定要知道,这种比较不会展现出所谓的对称相等性( symmetric equality)。 Dont put off till tomorrow what should be done today public int hashCode() hashCode()返回一个int值,能唯一标志不同对象。 1)可重用性:每次调用hashCode()方法必须返回相同的 int值 2)对称性:如果x.equals(y)=true,则 x.hashCode=y.hashCode,也就是说同时返回True ,或者False 3)如果!x.equals(y),并不要求 x.hashCode()!=y.hashCode(),但这样可以促进 hashtable等散列表的性能。 Dont put off till tomorrow what should be done today Hashcode l一个对象的hashcode就像我们普通人都用身份证做标志一样,任 何时刻我们的身份证号都是一样,同样,一个应用程序在不同系 统或者不同编译器,它的hashcode返回值都应该一样,这样能够 提高性能,特别是在与hashtable,hashmap的兼容处理上。 lEg:EqualsTest3.java Dont put off till tomorrow what should be done today 继承Comparator ljava.util.Comparator public int compare(Object obj1, Object obj2) EqualsTest5 o1 = (EqualsTest5)obj1; EqualsTest5 o2 = (EqualsTest5)obj2; if (o1.num = o2.num) if (o1.num o2.num) else return -1; Eg:EqualsTest5.java Dont put off till tomorrow what should be done today 中文问题 乱码 l世界上的各地区都有本地的语言。地区差异直 接导致了语言环境的差异。在开发一个国际化 程序的过程中,处理语言问题就显得尤为重要 。 l有时页面或者数据库乱码,Why? Dont put off till tomorrow what should be done today 不同语言的转换 A Unicode B 当其中任何一步映射不成功,就会导致乱码 Dont put off till tomorrow what should be done today 乱码举例 l有GB2312中有一个汉字“李”,其编码为“C0EE”,欲转 化为ISO8859-1编码。步骤为:先把“李”字转化为 Unicode,得到“674E”,再把“674E”转化为ISO8859-1 字符。当然,这个映射不会成功,因为ISO8859-1中根 本就没有与“674E”对应的字符。 当从某语言向Unicode转化时,如果在某语言中没有该 字符,得到的将是Unicode的代码“uffffd”(“u”表示是 Unicode编码,)。而从Unicode向某语言转化时,如果 某语言没有对应的字符,则得到的是“0x3f”(“?”)。 这就是“?”的由来。 Dont put off till tomorrow what should be done today 三jsp页面效果展示 ltest1.jsp ltest2.jsp Dont put off till tomorrow what should be done today Jsp-charset = GB2312时的变化过程 序号步骤说明结果 1 编写JSP源文件,且存为GB2312格式 D6 D0 CE C4 (D6D0=中 CEC4=文) 2 jspc把JSP源文件转化为临时JAVA文件,并把字符串 按照GB2312映射到Unicode,并用UTF格式写入 JAVA文件中 E4 B8 AD E6 96 87 3 把临时JAVA文件编译成CLASS文件E4 B8 AD E6 96 87 4 运行时,先从CLASS文件中用readUTF读出字符串, 在内存中的是Unicode编码 4E 2D 65 87(在 Unicode中4E2D=中 6587=文) 5 根据Jsp-charset=GB2312把Unicode转化为字节流 D6 D0 CE C4 6 把字节流输出到IE中,并设置IE的编码为GB2312( 作者按:这个信息隐藏在HTTP头中) D6 D0 CE C4 7 IE用“简体中文”查看结果 “中文”(正确显示) Dont put off till

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论