Java中的equals和hashCode
来源:互联网 发布:淘宝swot分析矩阵图 编辑:程序博客网 时间:2024/05/17 04:13
public boolean equals(Object obj)
Object类中对equals的默认实现方式是: return this == obj。 只有当this和obj引用同一个对象,才会返回true。
如果我们想判断两个对象是否等价而不是判断是否是同一个对象,就需要对equals进行重写。
按照约定,equals需要满足一下规则:
- 自反性:x.equals(x) 返回true;
- 对于null:x.equals(null) 返回false; (注意:null == null,返回true)
- 对称性:x.equals(y) 和 y.equals(x)的结果一致;
- 传递性:a和b equals, b 和 c equals,那么 a 和 c 也一定equals;
- 一致性:在某个运行期间,两个对象的状态的改变不会影响equals的决策结果,那么,在这个运行期间,无论调用多少起equals都会返回相同的结果。
一个例子:
class Test{ private int num; private String data; public boolean equals(Object obj) { if (this == obj) return true; if ((obj == null) || (obj.getClass() != this.getClass())) return false; //能执行到这里,说明obj和this同类且非null。 Test test = (Test) obj; //data是引用类型,所以在判断的时候,处理了字段为null的情况,如果不为空可以直接调用equals。 return num == test.num&& (data == test.data || (data != null && data.equals(test.data))); } public int hashCode() { //重写equals,也必须重写hashCode。具体后面介绍。 }}
- 在比较是否为同类时,在类没有子类时才可以使用instance,否则会影响对称性原则。
- 在具体比较对象的字段的时候,对于基本类型的字段,直接用==比较(注意浮点数的比较),对于引用类型的字段可以调用它们的equals(),需要处理字段为null的情况。对于浮点数的比较:
if ( Double.doubleToLongBits(d1) == Double.doubleToLongBits(d2) ) //d1 和 d2 是double类型if( Float.floatToIntBits(f1) == Float.floatToIntBits(f2) ) //f1 和 f2 是d2是float类型
- 具体什么字段需要进行比较,要根据具体的业务需求来决定。
- equals的参数类型是Object。所以如果同类,且需要进一步比较字段值的话,则需要将Object类型转换成本类的类型,如第一段代码的第15行。
public int hashCode()
返回对象的int类型的散列码,散列码是用来支持java中基于哈希机制的集合类。
约定:等价的(equals)对象的散列码必须相同,也就是说,对象中用于衡量equals的字段需要参与散列码的计算。不等价的对象,散列码不必相同。
0 0
- java中的equals和hashCode
- Java中的hashCode()和equals()
- java中的equals和hashCode
- Java中的equals()和hashCode()
- Java中的equals和hashCode
- Java中的hashCode()和equals()
- Java中的hashCode()和equals()
- Java中的equals和hashCode
- Java中的equals和hashCode
- java中的equals( )和hashcode( )
- Java中的hashcode 和 equals
- java中的hashcode()和equals()方法详解
- Java中的equals()和hashCode()方法
- Java中的hashcode()和equals()方法详解
- java中的hashcode()和equals()方法详解
- java中的hashCode()和equals()的关系
- Java中的hashcode()和equals()方法详解
- Java 中的 hashCode 和 equals 方法
- 学习《core java》记录 -- 第四章 Objects and Classes
- show engine innodb status解读
- ALGO-29 算法训练 校门外的树
- PAT-A 1027. Colors in Mars (20)
- 欢迎使用CSDN-markdown编辑器
- Java中的equals和hashCode
- 基于canvas的二维码邀请函生成插件
- git之fatal: unable to access 'https://git.oschina.net/pcmpcs/library.git/': Could not resolve host问题
- Struts——开源MVC框架
- 半年总结
- (转)天才抵不过天时:一群金融天才的两次灭顶之灾
- HDU 1043 Eight
- Light OJ 1282 Leading and Trailing
- 数据结构---串的模式匹配算法介绍