《JavaGeneralTechniques之EqualsMethodspecifica.ppt》由会员分享,可在线阅读,更多相关《JavaGeneralTechniques之EqualsMethodspecifica.ppt(24页珍藏版)》请在三一办公上搜索。
1、General Techniques,Equals Method specification,Jessica Tang,Opening _1,String str1=new String(jessica);String str2=new String(jessica);if(str1.equals(str2)System.out.println(str1 equals str2!);if(str1=str2)System.out.println(str1=str2);elseSystem.out.println(str1!=str2);,Opening _2,Eg:EqualsTest2.ja
2、vapublic 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!);elseSyst
3、em.out.println(a doesnt equals b!);if(a.equals(c)System.out.println(a equals c!);elseSystem.out.println(a doesnt equals c!);,不要依赖equals()的缺省实现,public boolean equals(Object obj)return(this=obj);对象只与本身相等,=&Equals,=用于比较引用和比较基本数据类型时具有不同的功能:比较基本数据类型,如果两个值相同,则结果为true;而在比较引用时,如果引用指向内存中的同一对象,结果为true注意点:大多数J
4、ava类库都实现了equals(),所以它实际比较的是对象的内容,而非它们的句柄例如,equals 方法(是String类从它的超类Object中继承的)被用来检测两个对象是否相等,即两个对象的内容是否相等。,Why Override Equals()?,尽管对象的内容相同,句柄却是不同的,而Object中的Equals方法比较的正好就是对象句柄。思考:若想对比两个对象的实际内容是否相同,又该如何操作呢?此时,必须使用所有对象都适用的特殊方法equals()。,Equals行事准则,若要比较对象是否相等,其class有责任提供一个正确的equals()。在想当然耳地调用equals()之前,应
5、先检查并确保你所使用的class的确实现了equals()。如果你所使用的class并未实现equals(),请判断的缺省函数码是否可胜任。如果无法胜任,就应该在某个外覆类(wrapper class)或subclass中撰写你自己的equals()。,Equals规则,1)自发性 x.equals(x)一定为true2)对称性 x.equals(y)为true y.equals(x)也为true3)传递性 x.equals(y)y.equals(z)为true,x.equals(z)也为true4)一致性 无论调用x.equals(y)多少次,返回值都是相等的5)谨慎性 x.equals(n
6、ull)一定返回false,如何覆盖Equals方法?,public boolean equals(Object o)if(this=o)return true;if(o!=null)上述方法如何在equals()函数中使用getClass(),这种做法使得只有隶属同一个class的对象才能被视为相等,如何覆盖Equals方法?,public boolean equals(Object o)if(this=o)return true;if(!(o instanceof EqualsTest1)return false;EqualsTest1 obj=(EqualsTest1)o;return(
7、obj.num=num)上述方法展示了派生类和基类,如何覆盖Equals方法?,实现equals()时优先考虑使用getClass()强型别自变量(strong argument)可以做到惟有相同class所产生的对象才得被视为相等。进一步的推论就是:如果两个对象隶属不同的classes或types,它们必不相等。Eg:EqualsTest1.java在equals()函数中谨慎使用instanceofderived class对象与其base class对象也可被视为相等 Eg:EqualsTest6.java,EqualsTest7.javaStep1_3,程序演示,Equals总结,如果
8、某个class的两个对象即使占据不同的内存空间,也可被视为逻辑上相等的话,那么你得为这个class提供一个equals()。请检查是否等于this。比较这个class中的相关属性(值域,fields),以判断两个对象是否相等。如果有以外的任何base class实现了equals(),那么就应该调用super.equals()。在equals()函数中面对getClass()和instanceof进行取舍时,你要仔细斟酌以下问题:如果只允许同一个class所产生的对象被视为相等,通常你应该使用getClass()。只有在不得不对derived classes对象与base classes对象进
9、行比较的场合中,才可以使用instanceof,而且你应该明白这样做带来的可能问题和复杂性。如果使用instanceof,而且derived class和base class都实现有equals(),你一定要知道,这种比较不会展现出所谓的对称相等性(symmetric equality)。,public int hashCode(),hashCode()返回一个int值,能唯一标志不同对象。1)可重用性:每次调用hashCode()方法必须返回相同的int值2)对称性:如果x.equals(y)=true,则x.hashCode=y.hashCode,也就是说同时返回True,或者False3
10、)如果!x.equals(y),并不要求x.hashCode()!=y.hashCode(),但这样可以促进hashtable等散列表的性能。,Hashcode,一个对象的hashcode就像我们普通人都用身份证做标志一样,任何时刻我们的身份证号都是一样,同样,一个应用程序在不同系统或者不同编译器,它的hashcode返回值都应该一样,这样能够提高性能,特别是在与hashtable,hashmap的兼容处理上。Eg:EqualsTest3.java,继承Comparator,public int compare(Object obj1,Object obj2)EqualsTest5 o1=(E
11、qualsTest5)obj1;EqualsTest5 o2=(EqualsTest5)obj2;if(o1.num=o2.num)Eg:EqualsTest5.java,中文问题乱码,世界上的各地区都有本地的语言。地区差异直接导致了语言环境的差异。在开发一个国际化程序的过程中,处理语言问题就显得尤为重要。有时页面或者数据库乱码,Why?,不同语言的转换,乱码举例,有GB2312中有一个汉字“李”,其编码为“C0EE”,欲转化为ISO8859-1编码。步骤为:先把“李”字转化为Unicode,得到“674E”,再把“674E”转化为ISO8859-1字符。当然,这个映射不会成功,因为ISO88
12、59-1中根本就没有与“674E”对应的字符。当从某语言向Unicode转化时,如果在某语言中没有该字符,得到的将是Unicode的代码“uffffd”(“u”表示是Unicode编码,)。而从Unicode向某语言转化时,如果某语言没有对应的字符,则得到的是“0 x3f”(“?”)。这就是“?”的由来。,三jsp页面效果展示,test1.jsptest2.jsp,Jsp-charset=GB2312时的变化过程,如何解决?(一),Jsp页面:,如何解决?(二),sqlserver数据库的jdbc驱动程序默认情况下采用ISO-8859-1编码,为了把从sqlserver数据库中读出的数据正确地显示在网页上或者存入数据库中,可以采取一下下列方法:JSP页面中:,Thank You,