java核心技术学习笔记8---equals()方法和hashCode()方法
来源:互联网 发布:山东11选5遗漏数据查询 编辑:程序博客网 时间:2024/06/05 02:14
equals方法
Object类中的equals方法用于检测一个对象是否等于另一个对象,即判断两个对象是否具有相同的引用。然而,经常需要检测两个对象状态的相等性。如果两个对象的状态相等,就认为两个对象是相等的。我们可以根据自己的需求重写equals方法。
Java语言规范要求equals方法具有闭包特性。
1)自反性:对于任何非空引用x,x.equals(x)应该返回true。
2)对称性:对于任何引用x和y,如果x.equals(y)返回true,那么y.equals(x)也应该返回true。
3)传递性:对于任何引用x,y,z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也应该返回true。
4)一致性:如果x,y引用的对象没有发生变化,那么反复调用x.equals(y)应该返回相同的结果。
5)对于任意非空引用x,x,equals(null)应该返回false。
getClass()方法返回一个对象所属的类,只有在两个对象属于同一个类时,这个值才可能相等。
OtherObject instanceOf(Object)方法比较OtherObject与Object类型是否有继承关系,即当OtherObject类型为Object类型或者Object类型的子类型时才返回true。
编写完美equals方法的建议:
1)显示参数命名为otherObject.
2)检测this与otherObject是否引用同一个对象:
if(this==otherObject)return true;
3)检测otherObject是否为null,如果为Null,返回false.
if(otherObject==null)return false;
比较this与otherObject是否属于同一个类。如果equals的语义在每个子类中都有所改变,用getClass()检测
if(!getClass()==otherObject.getClass())return false;
若所有子类都有一致的语义,用instanceof()检测
if(!otherObject.instanceOf(ClassName))return false;
4)将otherObject转换成相应的类类型变量
ClassName other=(ClassName)otherObject;
5)对需要比较的域进行比较,用==比较基本类型域,用equals()比较对象域。如果所有域相等,返回true,否则返回false;
return field1==other.field1 && field2.equals(other.field2).....
如果在子类中重新定义了equals,就要在其中包含调用super.equals(other)。
hasCode方法
散列码(hashCode) 是由对象导出的一个整数值。散列码是没有规律的。两个不同的对象的散列码基本上不会相同。
String类计算散列码算法
int hash=0;
for(int i=0;i<length();i++)
hash=31*hash+charAt(i);
hashCode()方法定义在Object类中,每个对象都有一个默认的散列码,其值为对象的存储地址。
字符串的散列码是由内容导出的,像StringBuffer类中没有定义hashCode方法,它的散列码是由Object类的默认hashCode方法导出的对象存储地址。
要判断两个对象是否相等,就要重写equals()方法,具体的实现网上很多。重写equals()方法一般都要重写HashCode()方法,这是为了提高存储效率,HashCode方法可以保
证相同的元素存储于相同的地址,理论上可以没有,但是如果没有,使用效率会大大降低。
实际上不重写的hashCode,编译器不会报错,一般情况下也不回出问题,只要你不用类似于Hashtable存放这些对象。
之所以要求hashcode和equals一致,主要考虑的还是Hashtable问题。
- java核心技术学习笔记8---equals()方法和hashCode()方法
- Java学习笔记(44)----------探索equals()和hashCode()方法
- 【JAVA学习】hashcode()和equals()方法剖析
- Java中的hashCode和equals方法学习
- Java equals 和 hashcode 方法
- java hashCode 和 equals 方法
- Java hashCode 和 equals 方法
- java的hashCode方法和equals方法
- Java中的equals方法和hashcode方法
- java的hashCode方法和equals方法
- Java中equals方法和hashCode方法
- java hashCode()方法和equals()方法
- Java中的equals()方法和hashcode()方法
- java中Equals方法和HashCode方法
- Java源码学习-Object类的hashCode和equals方法
- java Object对象中hashCode和equals方法学习
- java学习笔记 第6天 集合、重新Object的hashCode()和equals()方法
- JAVA学习笔记32——hashCode和equals方法+set接口
- UBUNTU中PL2303串口的使用
- java数组添加数组
- 编写一个函数判断输入的年月日是否合法。输入例如 2012 2 12形式
- 编写程序判断某年某月某日这一年中是第几天。
- Spring tomcat jdbc pool mybatis 集成配置
- java核心技术学习笔记8---equals()方法和hashCode()方法
- 2 frontpage+access数据库中查询数据
- JDK5.0新特性
- Android中的“再按一次返回键退出程序”实现
- css表格单元格中的长文本的显示问题
- Flyweight(享元)模式
- 编写函数判断某年某月某日这一年中是第几天,在主函数中调用该函数。
- 如何在Terminal命令行模式下运行Objective-C
- 技能前摇二版