关于Object类的equals方法和hashCode方法
关于Object类的equals的特点,对于非空引用:
1.自反性:x.equals(x) return true ;
2.对称性:x.equals(y)为true,那么y.equals(x)也为true;
3.传递性:x.equals(y)为true,y.equals(z)为true,那么x.equals(z)也为true;
4.一致性:x.equals(y)的第一次调用为true,那么x.equals(y)的第二次,第三次,。。。,第n次调用也为true,前提条件是在比较之间没有修改x,也没有修改y。
5.x.equals(null)返回false。
当override equals方法时,同时需要重写hashCode方法,以保证相同对象的hashCode值相同。
关于Object类的hashCode方法的特点:
1.在java应用的一次执行过程当中,对于同一个对象的hashCode方法的多次调用,应该返回同样的值。(前提是该对象的信息没有发生改变);
2.对于两个对象来说,如果使用equals方法比较返回true,那么这两个对象的hashCode值一定是相同的;
3.对于两个对象来说,如果使用equals方法比较返回false,那么这两个对象的hashCode值不要求一定不同,也就是说可以相同,也可以不同。但是,如果不同,则可以提高应用的性能。
4.对于Object类来说,不同的Object对象的hashCode值是不同的(Object类的hashCode值表示的是对象的地址,其他类如果重写了hashCode()方法,那么hashCode值就不一定表示的是地址了)。
如果我们重写equals方法,那么有也要重写hashCode方法,反之依然。
集合增加时的原理:
当使用HashSet时,hashCode()方法就会被调用,判断已经存储在集合中的对象的hashCode值是否与增加的对象的hashCode值一 致;如果不一致,直接加进去;如果一致,再进行equals方法的比较,equals方法如果返回true,表示对象已经加进去了,就不会再增加新的对 象,否则加进去。
String s1 = new String("a");
String s2 = new String("a");
System.out.println(s1..hashCode() == s2..hashCode());//返回true
HashSet set = new HashSet();
set.add(s1);
set.add(s2);
结果只会增加一个。因为String类重写了equals和hashCode方法,hashCode方法只是将字符串的内容通过一定的转换,转换成一个整数值。所以,String类的equals方法,只要两个字符串内容相同,则equals返回true。
另外一个例子:
首先,定义一个People类,未重写equals方法和hashCode方法。
public class People
{
private String name;
public People(String name)
{
super();
this.name = name;
}
//省略get/set方法
}
People p1 = new People("a");
People p2 = new People("a");
set.add(p1);
set.add(p2);
执行结果:
P1和P2都会加到set集合里面去,因为People类继承自Object类,Object类的hashCode()方法返回的值是地址的一种表现形式,因为P1和P2地址是不相同的,所以hashCode值也是不相同的,所以都会被加入到set集合里面。
关于Object类的equals方法和hashCode方法的更多相关文章
- equals()方法和hashCode()方法详解
equals()方法和hashCode()方法详解 1. Object类中equals()方法源代码如下所示: /** * Object类中的equals()方法 */ public boolean ...
- 详解equals()方法和hashCode()方法
前言 Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码.equals()和hashCode()都不是final方 ...
- Java基础系列-equals方法和hashCode方法
原创文章,转载请标注出处:<Java基础系列-equals方法和hashCode方法> 概述 equals方法和hashCode方法都是有Object类定义的. publi ...
- Java 如何重写对象的 equals 方法和 hashCode 方法
前言:Java 对象如果要比较是否相等,则需要重写 equals 方法,同时重写 hashCode 方法,而且 hashCode 方法里面使用质数 31.接下来看看各种为什么. 一.需求: 对比两个对 ...
- 详解 equals() 方法和 hashCode() 方法
创建实体类时,最好重写超类(Object)的hashCode()和equals()方法 equals()方法: 通过该实现可以看出,Object类的实现采用了区分度最高的算法,即只要两个对象不是同一个 ...
- HashSet中存方用户自己定义数据类型数据,重写equals方法和hashCode方法
import java.util.Set; import java.util.HashSet; public class SetTest { public static void main(Strin ...
- java中equals方法和hashcode方法的区别和联系,以及为什么要重写这两个方法,不重写会怎样
一.在Object类中的定义为:public native int hashCode();是一个本地方法,返回的对象的地址值.但是,同样的思路,在String等封装类中对此方法进行了重写.方法调用得到 ...
- Java equals()方法和hashCode()方法
equals()方法 如果满足了以下任何一个条件,就不需要覆盖equals()方法: 1 类的每个实例本质上都是唯一的. 2 不关心类是否提供了“逻辑相等”的测试功能. 3 父类已经覆盖了equals ...
- JAVA正确地自定义比较对象---如何重写equals方法和hashCode方法
在实际应用中经常会比较两个对象是否相等,比如下面的Address类,它有两个属性:String province 和 String city. public class Address { priva ...
随机推荐
- Pytorch(一)
一.Pytorch介绍 Pytorch 是Torch在Python上的衍生物 和Tensorflow相比: Pytorch建立的神经网络是动态的,而Tensorflow建立的神经网络是静态的 Tens ...
- ionic学习笔记—常用命令
Ionic CLI介绍 Ionic CLI是开发Ionic应用程序过程中使用的主要工具.它就像一个瑞士军刀:它在一个界面下汇集了大量工具. CLI包含许多对Ionic开发至关重要的命令,例如start ...
- TypeScript学习笔记—函数
函数定义 在 JavaScript 中,有两种常见的定义函数的方式——函数声明(Function Declaration)和函数表达式(Function Expression): // 函数声明(Fu ...
- zookeer安装
解压:tar xf zookeeper-3.4.9.tar.gz进入目录cd /opt/zookeeper-3.4.9/ 编辑配置文件:vim zoo.cfg# The number of milli ...
- Java IO流简单使用
Java IO流简单使用 也许是以前IO方面接触的比较少,我对于读和写的概念老是混淆. 趁着现在实习比较闲小结一下,我个人理解读和写都是针对程序,分别就是程序的输入和输出,或者叫读入写出. Java ...
- 吴超老师课程--Hbase Shell
hbase提供了一个shell的终端给用户交互 名称 命令表达式 创建表 create '表名称', '列族名称1','列族名称2','列族名称N' 添加记录 put '表名称', '行名称', '列 ...
- 跨平台编译CMake使用
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程).他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的 ...
- sqlserver建立相同的表结构
select * into purpose from source 来自为知笔记(Wiz)
- 将php数组存取到本地文件
存数组: <?php $data = array( "a" => "aaaaaa", "b" => "bbbbb ...
- 常用的Issue解决方案(EF框架)
1.提交出错:ObjectStateManager 中已存在具有同一键的对象. ObjectStateManager 无法跟踪具有相同键的多个对象. 遇到此问题,首先要确定的是主键是否赋值,以及 ...