关于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方法的更多相关文章

  1. equals()方法和hashCode()方法详解

    equals()方法和hashCode()方法详解 1. Object类中equals()方法源代码如下所示: /** * Object类中的equals()方法 */ public boolean ...

  2. 详解equals()方法和hashCode()方法

    前言 Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码.equals()和hashCode()都不是final方 ...

  3. Java基础系列-equals方法和hashCode方法

    原创文章,转载请标注出处:<Java基础系列-equals方法和hashCode方法> 概述         equals方法和hashCode方法都是有Object类定义的. publi ...

  4. Java 如何重写对象的 equals 方法和 hashCode 方法

    前言:Java 对象如果要比较是否相等,则需要重写 equals 方法,同时重写 hashCode 方法,而且 hashCode 方法里面使用质数 31.接下来看看各种为什么. 一.需求: 对比两个对 ...

  5. 详解 equals() 方法和 hashCode() 方法

    创建实体类时,最好重写超类(Object)的hashCode()和equals()方法 equals()方法: 通过该实现可以看出,Object类的实现采用了区分度最高的算法,即只要两个对象不是同一个 ...

  6. HashSet中存方用户自己定义数据类型数据,重写equals方法和hashCode方法

    import java.util.Set; import java.util.HashSet; public class SetTest { public static void main(Strin ...

  7. java中equals方法和hashcode方法的区别和联系,以及为什么要重写这两个方法,不重写会怎样

    一.在Object类中的定义为:public native int hashCode();是一个本地方法,返回的对象的地址值.但是,同样的思路,在String等封装类中对此方法进行了重写.方法调用得到 ...

  8. Java equals()方法和hashCode()方法

    equals()方法 如果满足了以下任何一个条件,就不需要覆盖equals()方法: 1 类的每个实例本质上都是唯一的. 2 不关心类是否提供了“逻辑相等”的测试功能. 3 父类已经覆盖了equals ...

  9. JAVA正确地自定义比较对象---如何重写equals方法和hashCode方法

    在实际应用中经常会比较两个对象是否相等,比如下面的Address类,它有两个属性:String province 和 String city. public class Address { priva ...

随机推荐

  1. Pytorch(一)

    一.Pytorch介绍 Pytorch 是Torch在Python上的衍生物 和Tensorflow相比: Pytorch建立的神经网络是动态的,而Tensorflow建立的神经网络是静态的 Tens ...

  2. ionic学习笔记—常用命令

    Ionic CLI介绍 Ionic CLI是开发Ionic应用程序过程中使用的主要工具.它就像一个瑞士军刀:它在一个界面下汇集了大量工具. CLI包含许多对Ionic开发至关重要的命令,例如start ...

  3. TypeScript学习笔记—函数

    函数定义 在 JavaScript 中,有两种常见的定义函数的方式——函数声明(Function Declaration)和函数表达式(Function Expression): // 函数声明(Fu ...

  4. zookeer安装

    解压:tar xf zookeeper-3.4.9.tar.gz进入目录cd /opt/zookeeper-3.4.9/ 编辑配置文件:vim zoo.cfg# The number of milli ...

  5. Java IO流简单使用

    Java IO流简单使用 也许是以前IO方面接触的比较少,我对于读和写的概念老是混淆. 趁着现在实习比较闲小结一下,我个人理解读和写都是针对程序,分别就是程序的输入和输出,或者叫读入写出. Java ...

  6. 吴超老师课程--Hbase Shell

    hbase提供了一个shell的终端给用户交互 名称 命令表达式 创建表 create '表名称', '列族名称1','列族名称2','列族名称N' 添加记录 put '表名称', '行名称', '列 ...

  7. 跨平台编译CMake使用

    CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程).他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的 ...

  8. sqlserver建立相同的表结构

    select * into purpose from source 来自为知笔记(Wiz)

  9. 将php数组存取到本地文件

    存数组: <?php $data = array( "a" => "aaaaaa", "b" => "bbbbb ...

  10. 常用的Issue解决方案(EF框架)

    1.提交出错:ObjectStateManager 中已存在具有同一键的对象.    ObjectStateManager 无法跟踪具有相同键的多个对象. 遇到此问题,首先要确定的是主键是否赋值,以及 ...