问写好 equals 方法 本帖最后由 Ark_Xu 于 2010-07-01 00:03:12 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1.equals 一般只考虑同一类的对象值相等是否相等 依需求定 是引用相等 只需要=2.getClass() 返回的是 类类型 根据第一点所以要先判断 这两个类是不是同一类3.instanceof 有点耗资源 如果用 getClass().toString() 就可以判断最好4.如果子类可以跟父类比较 那么要用getClass().toString() 判断是否是父子关系5.这个主要用于不可以存储重复对象的集合是 才覆写hashCode 方法。重复对象 是用equals 判断的equals 一般用于判断对象值是否想等 在集合里面会用特殊的算法形成值 而这个算法用到了hashCode 方法 第5点我也暂时说不清 应该这么理解5.这个主要是因为该类会用于不可以存储重复对象的集合的时候. 重复对象的判断用到了equals 和hashCode 方法。 使用instanceof的例子中,父类对象和子类对象相互equals看看,不满足equals的约定 建议读一下effective java这本书,有一节专门讲这些问题 如果重新定义 equals 方法 就必须重新定义 hashCode 方法2楼解释了,hashSet和hashMap都是根据计算对象的hashcode来确定对象位置的,1、计算两个对象的hashcode,如果相等,转2,如果不等,直接放入2、判断两个对象equals,返回true,抛弃掉,返回false,放入如果你只重写equals而不重写hashcode的话,就会发现很多业务上的BUG 不知道为什么LZ要重写equals();呢? effective java里面写的很好,改写equals应该注意的一些地方,建议看下~ 能不能顺便问一下hashCode一般应该怎么写? 楼上都解释了hashcode和equals了还是蛮好的至于这么写hashcode 你覆盖Obeject中hashcode方法就行了,但在Collection中一定要注意:尽量做到随即,不聚集! 假设有一个 Employee 类 Mannger 类继承了它这时候子类和超类的对象 getClass 相等么 equals 这是API里说的:equals 方法在非空对象引用上实现相等关系: 自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。 对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。 传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。 一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。 对于任何非空引用值 x,x.equals(null) 都应返回 false。 equals() 表示是意思是 是否相等。他表示的是在逻辑层面上的相等,和唯一。 hashcode() 返回该对象的哈希码值,他被用在凡是利对象hash特性的实现上,比如HashMap,HashSet 等。他可以提高效率。API 中是这样说的:hashCode 的常规协定是: 在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。 如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。 如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。 所以他们都表示对象的唯一性,只过是在不同的层面上而以,但唯一性都是一致的,统一的。所以一般在重写 equals ,也要重写 hashCode。 Javax.mail发送邮件是否可以实现保存到发件箱 JTextPanel的用法? 弟兄们,给个正则了 我写的一个BEAN,但是有问题~大家帮我! jar文件能加密吗?怎么保护自己的程序 你对 swing 的信心打几分,满分10分? 关于输出对象实例的问题,在线等候,谢谢 有delphi和pb做项目基础,现在想学J++BUILDER和BCB,请问先学那一个,本人没有C/C++语法基础 我又来给大家送分来了,想提前致富的快来抢吧! 请问用java可以编写在已知网页上画线或画方框吗? 找错!送分,今天无意中发现的错误。 将String二维数组转换成double类型二维数组
2.getClass() 返回的是 类类型 根据第一点所以要先判断 这两个类是不是同一类
3.instanceof 有点耗资源 如果用 getClass().toString() 就可以判断最好
4.如果子类可以跟父类比较 那么要用getClass().toString() 判断是否是父子关系
5.这个主要用于不可以存储重复对象的集合是 才覆写hashCode 方法。重复对象 是用equals 判断的
equals 一般用于判断对象值是否想等 在集合里面会用特殊的算法形成值 而这个算法用到了hashCode 方法
5.这个主要是因为该类会用于不可以存储重复对象的集合的时候. 重复对象的判断用到了equals 和hashCode 方法。
hashSet和hashMap都是根据计算对象的hashcode来确定对象位置的,
1、计算两个对象的hashcode,如果相等,转2,如果不等,直接放入
2、判断两个对象equals,返回true,抛弃掉,返回false,放入如果你只重写equals而不重写hashcode的话,就会发现很多业务上的BUG
还是蛮好的
至于这么写hashcode 你覆盖Obeject中hashcode方法就行了,但在Collection中一定要注意:尽量做到
随即,不聚集!
这时候子类和超类的对象 getClass 相等么
equals 方法在非空对象引用上实现相等关系: 自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
对于任何非空引用值 x,x.equals(null) 都应返回 false。 equals() 表示是意思是 是否相等。他表示的是在逻辑层面上的相等,和唯一。
hashcode() 返回该对象的哈希码值,他被用在凡是利对象hash特性的实现上,比如HashMap,HashSet 等。他可以提高效率。
API 中是这样说的:
hashCode 的常规协定是: 在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。
所以他们都表示对象的唯一性,只过是在不同的层面上而以,但唯一性都是一致的,统一的。
所以一般在重写 equals ,也要重写 hashCode。