- 浏览: 186023 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
netwelfare:
这篇文章关于jsessionid讲解的不错。关于jsessio ...
关于JSessionID【转】 -
ITcms:
Activity直接执行了onCreate方法的那部分,我觉得 ...
Android之Activity学习 -
tinygroup:
Sorry发错了。
蛇形矩阵的java实现 -
tinygroup:
public static int[][] spira ...
蛇形矩阵的java实现 -
laitao:
[*]引用pulic djs
Servlet的生命周期
JDK的java.lang.Object类中实现了equals函数,其定义说明如下:
其具体的实现代码如下所示:
- public boolean equals(Object obj) {
- return (this == obj);
- }
从上面的代码中可以看出,Object类的equals实现只是简单地调用了“==”运算符,也即定义中说明的,对于两个非空对象X和Y,有且仅当X和Y指向同一个对象时该函数才返回true。由于Object类是java中所有类的超类,因而其它任何类都默认继承了此函数。在大多数情况下,此默认的实现方式是合适的,因为任一个类本质上都是唯一的;但是对于那些表示“值”的类(如Integer、String等),它们引入了自己特有的“逻辑相等”的概念,此时就必须修改equals函数的实现。
例如java.lang.String类的实现如下:
- public boolean equals(Object anObject) {
- if (this == anObject) {
- return true;
- }
- if (anObject instanceof String) {
- String anotherString = (String)anObject;
- int n = count;
- if (n == anotherString.count) {
- char v1[] = value;
- char v2[] = anotherString.value;
- int i = offset;
- int j = anotherString.offset;
- while (n-- != 0) {
- if (v1[i++] != v2[j++])
- return false;
- }
- return true;
- }
- }
- return false;
- }
而java.lang.Integer类的实现如下:
- public boolean equals(Object obj) {
- if (obj instanceof Integer) {
- return value == ((Integer)obj).intValue();
- }
- return false;
- }
String类的equals实现使得当两个String对象所表示的字符串的值是一样的时候就能返回true;而Integer类则当两个Integer对象所持有的整数值是一样的时候就能返回true。
因此,当我们我们自己编写的类需要引入“逻辑相等”的概念,且其超类又没有改写equals的实现时,我们就必须实现自己的equals函数。在上面Object类中关于equals函数的说明中,定义了5条改写equals函数所必须遵守的规范。其中第1条自反性(reflexivity)和第5条通常能够自行满足。下面我们重点介绍下第2点对称性(symmetric)、第3点传递性(transitive)和第4点一致性(consistent)。
对称性
即对于任意两个引用值X和Y,X.equals(Y) 和 Y.equals(X) 返回的结果必须是一致的。下面引用《effect java》上的例子来说明了违反这一特性的后果:
- public class CaseInsensitiveString {
- private String s;
- public boolean equals(Object obj){
- if(obj instanceof CaseInsensitiveString)
- return s.equalsIgnoreCase(((CaseInsensitiveString)obj).s);
- if(obj instanceof String)
- return s.equalsIgnoreCase((String)obj);
- return false;
- }
- }
然后我们定义如下的类来进行测试:
- public void test(){
- CaseInsensitiveString cis = new CaseInsensitiveString("Value");
- String s = "Value";
- List list = new ArrayList();
- list.add(cis);
- System.out.println(cis.equals(s));
- System.out.println(s.equals(cis));
- System.out.println(list.contains(s));
- }
运行test(),第一条语句的输出为true,而后两条为false。因为CaseInsensitiveString类中equals函数对String对象的比较也可能返回true,只要其大小写不敏感的字符串值相等;而在String类中对任何非String对象都返回false,这样CaseInsensitiveString的实现就违反了对称性,从而导致了第三条语句也返回了意想不到的结果false。这是因为ArrayList的contains函数实现是用实参s对list中每一个对象调用equals函数,若有equals函数返回true,则contains返回true;因而在这里contains函数必然返回false。因此,如果违反了对称性,则可能会得到意料之外的结果。解决此问题的一个办法就是在CaseInsensitiveString类的equals函数中对Stirng对象的比较无论值是否一致都返回false。
传递性
即对于任意的引用值X、Y和Z,如果 X.equals(Y) 和 Y.equals(Z) 都返回true,则 X.equals(Z) 也一定返回true。下面举例说明:
- public class Point {
- private final int x;
- private final int y;
- public Point(int x, int y) {
- this.x = x;
- this.y = y;
- }
- public boolean equals(Object obj) {
- if (!(obj instanceof Point))
- return false;
- Point p = (Point) obj;
- return p.x == x && p.y == y;
- }
- }
- public class ColorPoint extends Point {
- private int z;
- public ColorPoint(int x, int y, int z) {
- super(x, y);
- this.z = z;
- }
- public boolean equals(Object obj) {
- if (!(obj instanceof ColorPoint))
- return false;
- ColorPoint cp = (ColorPoint) obj;
- return super.equals(obj) && cp.z == this.z;
- }
- }
在上面的代码中定义了类Point及其子类ColorPoint,并分别改写了equals函数。下面运行如下代码来测试:
- ColorPoint cp1 = new ColorPoint(1,2,3);
- ColorPoint cp2 = new ColorPoint(1,2,4);
- Point p = new Point(1,2);
- System.out.println(cp1.equals(p));
- System.out.println(p.equals(cp2));
- System.out.println(cp1.equals(cp2));
结果前两条语句输出“true”,而最后一条语句输出为“false”;从而违反了传递性规范。其主要原因是在基类的equals函数中并未对子类加以区分,从而使得基类与子类之间的比较也能返回true。要解决此方法,《effect java》上提供了“复合代替继承”的方法;另外,如果可以将基类和子类视为不等的话,使用 getClass()函数代替 instanceof 运算符进行比较可以很好的解决这一问题。getClass()会返回此对象的运行期类(runtime class),因为基类和子类属于不同的class,getClass()能够将其区分开来。下面是一段示例的代码:
- public boolean equals(Object obj) {
- if(obj.getClass() != this.getClass())
- return false;
- Point p = (Point) obj;
- return p.x == x && p.y == y;
- }
发表评论
-
Java序列化机制和原理【转】
2011-05-18 09:14 1080序列化的必要性 Java中,一切都是对象,在分布式环境中经 ... -
JAVA反射机制的应用(2)
2010-12-07 16:28 1188JAVA反射机制的应用(2 ... -
JAVA反射机制的简单应用(1)
2010-12-06 13:15 1373JAVA反射机制的简单应用(1) Spring中的IOC ... -
java反射学习笔记
2010-12-05 10:21 1519java反射作用: 1、自省:通过对象自身获得类结构,继 ... -
Java反射笔记(2)
2010-12-02 09:46 1687java.lang.array提供了动态 ... -
Java反射笔记(1)
2010-12-01 10:54 1096感谢张龙老师的视频:http://www.verycd.com ... -
连接池的基本工作原理及简单实现
2010-11-24 21:25 873连接池的基本工 ... -
Java 继承与组合的区别
2010-11-22 10:36 7943根据网络上大家对 ... -
蛇形矩阵的java实现
2010-11-10 22:22 7812题目: 计算并输出 nXn ... -
两个矩阵的乘积的java实现
2010-11-10 16:23 8290题目: 计算两个矩阵 A、B 的乘积矩阵 C。 ... -
螺旋数组的java实现
2010-11-10 15:26 2046螺旋数组 要求:存储和输出nXm的螺旋数组,其中n和m为 ... -
统计一个整数中出现次数最多最大的数字
2010-11-10 09:31 6496要求: 统计一个整数中出现最多的数字。如果数字个数 ... -
“百元买百鸡问题”之一重循环实现
2010-11-09 10:06 3672问题描述: 每只母鸡 3 元,每只公鸡 4 元,每只小鸡 0 ... -
[转]欧几里得算法(辗转相除法)求最大公约数
2010-11-08 22:52 2816欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数 ... -
[转]深入理解自增自减运算符a=a++和a=++a
2010-11-07 23:04 3190更深入地理解自增自减运算符 首先贴一个非常简洁却 ... -
[转]java中char,byte,short的移位操作
2010-11-07 22:38 4707在Think in Java中有这么一段话“对c ... -
笔试题之以单词为最小单位翻转字符串
2010-11-06 15:39 2350最近做了几个公司 ... -
java解惑之无穷大和NaN
2010-11-01 10:12 17461、i == i + 1 一个数字永远不会等于它自己加1 ... -
java 死锁及解决
2010-10-31 21:28 1096Java线程死锁如何避免 ... -
深入Java关键字null
2010-10-31 14:20 807深入Java关键字null ...
相关推荐
原因是因为,在Java自带的容器HashMap和HashSet中, 都需同时要用到对象的hashCode()和equals()方法来进行判断,然后再插入删除元素,这点我们一会再谈。 那么我们还是单独来看hashCode(),为什么HashMap需要用到...
equals():反映的是对象或变量具体的值,即两个对象里面包含的值--可能是对象的引用,也可能是值类型的值。 hashCode():计算出对象实例的哈希码,并返回哈希码,又称为散列函数。根类Object的hashCode()方法的...
在Java语言中,equals()和hashCode()两个函数的使用是紧密配合的,你要是自己设计其中一个,要设计另外一个。在多数情况 下,这两个函数是不用考虑的,直接使用它们的默认设计可以了。但是在一些情况下,这两个...
synchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块。如果 再细的分类,synchronized可作用于instance变量、object reference(对象引用)、static函数和class ...
@EqualsAndHashCode:自动生成 equals 和 hashCode 方法,用于对象的比较和哈希处理。 @NoArgsConstructor / @RequiredArgsConstructor / @AllArgsConstructor:自动生成构造函数。 @Data:整合了 @Getter、@...
第9章 常用类 4课时 理解Object类及其常用方法equals,hashCode和finalize等。 能够使用String,StringBuffer,StringBuilder类创建字符串对象和使用其方法,分辨不同类之间的区别。 ...
卡萨瓦 该库提供了一些有用的kotlin扩展函数,用于在没有所有样板的情况下实现toString() , equals()和hashCode() 。 该库的主要动机是用于无法使用数据类且需要通过以下方式实现toString() / equals() / hashCode...
equals()方法和hashCode()方法 270 数据结构 273 Array方法类汇总 304 Java数组与集合小结 305 递归 309 对象的序列化 310 Java两种线程类:Thread和Runnable 315 Java锁小结 321 java.util.concurrent.locks包下...
9.3 实现equals、hashCode和compareTo方法 198 9.3.1 安全的Null值相等测试 198 9.3.2 计算哈希码 199 9.3.3 比较数值类型对象 200 9.4 安全需要 201 9.5 其他改动 204 9.5.1 将字符串转换为数字 204 9.5.2 全局...
第1章 Java概述 1 1.1 Java语言的发展简史 2 1.2 Java的竞争对手及各自优势 4 1.2.1 C#简介和优势 4 1.2.2 Ruby简介和优势 4 1.2.3 Python的简介和优势 5 1.3 Java程序运行机制 5 1.3.1 高级语言的运行机制 6...
3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗? 4.final 在 java 中有什么作用? 5.java 中的 Math.round(-1.5) 等于多少? 6.String 属于基础的数据类型吗? 7.java 中操作字符串都有哪些类?它们...
10.4.5 远程对象与equals、hashCode和clone方法 10.5 远程对象激活 10.6 Web Services与JAX-WS 10.6.1 使用JAX-WS 10.6.2 Web服务的客户端 10.6.3 Amazon的E-Commerce服务 第十一章 脚本、编译与注解处理 11.1 Java...
equals和hashcode(, ) string,stringbuffer和stringbuilder(,,,, ) 伪泛型(, , ) 自动装箱(,) Try-with-resources() 序列化 反序列化(, , , ) interface 和 abstract class 区别 变长参数( ) 枚举详解(, , , , ) ...
44_equals函数的作用.mp4 45_hashCode()与toString().mp4 46_开发工具之Eclipse(一).mp4 47_开发工具之Eclipse(二).mp4 48_开发工具之Eclipse(三).mp4 49_开发工具之Eclipse(四).mp4 50_综合练习(一).mp4 51_综合...
前言 2019年为了秋招,精挑细学了这一份面试题,并且只挑重点和难点,此次整理包括 Java、数据结构与算法、计算机网络、操作系统、数据库等。如果你能把这些面试题都...java中==和equals和hashCode的区别 int与integ
像普通的Kotlin数据类一样,您所要做的就是在类的构造函数中提供成员。 然后为其提供@Poko批注,并享受生成的toString , equals和hashCode 。 (将添加针对Java使用者的Builder类和针对Kotlin使用者的DSL初始化器...
本书是第II卷,以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Java进行桌面程序开发各个方面的知识和技巧,主要包括Java语法与面向对象技术、Java高级应用、窗体与控件应用、文件操作...