关于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. 【Navicat连接Oracle数据库】-Navicat连接Oracle数据库设置

    1.navicat连接数据配置信息如下图所示:   点击"确定"按钮,进入到软件   按照图中所画的步骤顺序操作,最后重新启动navicat就可. 关于里面的这个文件夹 insta ...

  2. Redis持久化方式RDB和AOF

    Redis 持久化 RDB(快照) 优点 rdb是可进行压缩的二进制文件,表示Redis在某一个时间点的数据快照.非常使用与备份,灾难恢复等场景.比如使用定时任务执行bgsave并备份rdb到serv ...

  3. [Python] Send emails to the recepients specified in Message["CC"]

    Recently, I'm working on a small program which needs to send emails to specific accounts. When I wan ...

  4. Xcode 错误问题以及解决方法(后期遇到还会添加)

    1,/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhon ...

  5. IE10、火狐浏、谷歌浏览器 KindEditor无法获取textarea值

    http://e-mailwu.blog.163.com/blog/static/651040362013311160913/ 在IE10.火狐浏览器.谷歌浏览器下后台KindEditor在线编辑器无 ...

  6. shell sed 命令

    1:行首空格  sed 's/^[ \t]*//g'  2:行末空格 sed 's/[ \t]*$//g' 3,删除行首的空格或TAB,并删除<tr>.cat poem2id.txt | ...

  7. ThinkPHP框架之模型

    一.数据库配置 在父类配置ThinkPHP/Conf/convention.php中,找到数据库设置部分: 将这部分复制到我们模块的配置文件Home/Conf/config.php中,将需要的参数写上 ...

  8. canvas 事件绑定

    Canvas事件绑定   canvas事件绑定 众所周知canvas是位图,在位图里我们可以在里面画各种东西,可以是图片,可以是线条等等.那我们想给canvas里的某一张图片添加一个点击事件该怎么做到 ...

  9. netty3---传统IO,NIO,nettyIO

    传统: NIO: nettyIO: 每个服务生负责一个区域,每个服务生是一个线程.

  10. C# 中与等于 &= 操作符

    MSDN说,x&=y等价于 x=x&y. 整型时&运算符,进行位运算. bool类型时,&运算符,当两边结果都为ture时,结果才为true.