Java中的equals,==和hashCode的区别与联系

概念

  • ==:该操作符生成的是一个boolean结果,计算的是操作数的值之间的关系
  • equals:该方法是Object的实例方法,比较两个对象的content是否相同
  • hashCode:Object的native方法,获取对象的哈希值。用于确定该对象在哈希表中的索引位置,实际上是一个int型整数。

关系操作符 ==

比较基本数据类型变量

Java中有八种基本数据类型:

  • 整型:byte(1 byte),short(2 byte),int(4 byte),long(8 byte)
  • 字符型:char(2 byte)
  • 浮点型:float(4 byte),double(8 byte)
  • 布尔型:boolean(JVM规范没有明确规定其所占的空间大小,仅规定其只能够取字面值”true”和”false”)

对于这八种基本数据类型的比较,因为变量直接存储的是"值",因此,在使用关系操作符 == 来进行比较时,比较的就是“值”本身。

比较引用类型变量

在Java中,引用类型的变量存储的并不是“值”本身,而是与其关联的对象在内存中的地址。所有此时==运算符比较的是对象的地址。

小结
  • 如果变量的类型是基本数据类型,则 “==” 判断的是左右两边操作数的值是否相等。
  • 如果变量的类型是引用数据类型,则 “==” 判断的是左右两边操作数的内存地址是否相同。也就是判断两边的变量是不是同一个对象。

equals

equals()方法是Object的一个实例方法,定义如下:

public boolean equals(Object obj){
	return (this == obj);
}

也就是说,如果没有重写equals方法时,调用的是Object 的equals方法,也就是比较两个对象的地址,判断两个对象是不是同一个对象。
如果重写了equals方法,如String类中:

public int hashCode() { 
    int h = hash; 
    if (h == 0) { 
        char val[] = value; 
        int len = count; 
        for (int i = 0; i < len; i++) { 
            h = 31*h + val[off++]; 
        } 
        hash = h; 
    } 
    return h; 
} 

所以此时是进行内容的比较。

hashCode

hashCode是Object中的一个本地方法,返回对象的地址值,定义为:

public native int hashCode();

equals与hashCode的关系

  1. 如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同;
  2. 如果两个对象的hashCode相同,它们并不一定相同(即用equals比较返回false)。
    原因:为了提高程序的效率才实现了hashCode方法,因为hashCode是一个int型整数,所以比较速度较快,所以先进行hashCode的比较,如果不同,那就没必要在进行equals的比较了,这样就大大减少了equals比较的次数,能够很大的提升比较的效率,由于Object中的hashCode返回的散列值与对象的地址有关,所以不同对象的散列值一定不同,这样先比较hashcode就没有意义了,所以这就是为什么重写equals方法时也要重写hashCode方法的原因。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值