java-“==”、equals和hashcode有什么区别

1)"=="运算符是比较两个变量的值是否相等。也就是说,该运算符用于比较变量对应的内存中所存储的值是否相等,要比较两个基础类型的数据或两个引用变量是否相等,只能使用"=="运算符。

具体而言,如果两个变量是基础类型,可以直接使用"=="运算符判断对应的值是否相等。如果一个变量指向的是对象(引用类型),那么,此时涉及两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如对于语句String s = new String(),变量s占用一块存储空间,而new String()占用另一块存储空间,此时变量s所对应对应内存中的存储数值就是对象占用的那块内存的首地址。对于指向类型的变量,如果判断两个变量是否指向一个相同的对象,即要比较这两个变量对应的内存中的数值是否相同(这两个变量是否指向同一个变量),这时可以通过"=="运算符来进行比较,但是如果要比较这两个对象的内容是否相等,使用"=="就无法实现了。

2)equals是Object对象中的方法,每个Java类都继承于Object,所以每一个对象都具有equals方法,Object中的equals方法直接使用"=="运算符来比较两个对象,所以在没有覆盖equals方法的情况下,equals与"=="结果是一样的,都是比较对象的引用。

相比"=="运算符,equals方法的特殊之处就是可以被覆盖,所以可以通过覆盖,让该方法比较的不是引用,而是我们需要的数据内容,,例如,String类中的equals方法是用于比较两个独立的对象的内容是否相同,即堆中的内容是否相等,以下面的代码为例:

String s1= new String("hello");

String s2= new String("hello");

两个new语句创建了两个对象,然后分别用s1和s2指向一个对象,这是两个不同的对象,他们的首地址是不相同的,即s1和s2存储的数值是不相同的,所以表达式s1==s2将返回false,而这两个对象的内容是相同的,所以equals方法将返回true。

通过以上例子可以说明,如果一个类没有复写euqals方法,那么它就从Object中继承equals方法,并且默认使用"=="运算符来进行比较,也就是在比较两个对象的引用是否相同,因此equals和==会得到相同的结果。若比较两个独立的对象,则总会返回false。如果编写的类希望能够比较该类创建的两个实例对象的内容是否相等,那么必须覆盖equals方法。

3)hashCode()方法是从Object类中继承的,它也鉴定两个对象是否相等,Object类中的hashCode返回对象在内存中的地址的int值,所以在不重写hashcode方法时,任何对象的hashcode都是不相同的。

虽然equals也是比较两个对象是否相等的,但是它和hashCode方法是有区别的。一般来讲,equals方法是给用户来使用的,如果要判断两个对象是否相等,需要覆盖equals方法,然后在代码中调用,这样就可以判断它们是否相等了。对于hashCode方法用户一般是不会调用它的,例如在hashMap中,由于key是不重复的,它在判断key是否重复的时候就调用了hashCode方法,而且也用类equals方法。此处不可重复,指的是,equals和hashCode方法中的一个不相同就可以了。所以hashCode相等于一个对象的编码表,就好像文件中的md5,它与equals方法的区别在于它的返回值是int类型,比较起来不直观。

一般在覆盖equals方法的同时也同样需要覆盖hashCode方法,否则,就会违反Object.hashCode的通用规则约定,从而导致无法与所有基于散列表的集合类(hashMap hashSet hashTable)结合在一起正常使用。

hashCode方法和equals方法的关系如下:如果x.equals的返回值true,即两个对象通过equals方法比较是相同的,那么调用二者的hashCode方法将返回相同的int值。如果x.equals的返回值false,即两个对象通过quals方法比较的结果是不相同的,那么x,y的hashCode的返回值可能相等也可能不相等。反之,hashCode的返回值不相等,一定可以推出equals方法的返回值是不相等的,而hashCode的返回值相等,equals的返回值可能相等也可能不相等。

时间: 2024-08-02 22:59:47

java-“==”、equals和hashcode有什么区别的相关文章

java ==、equals、hashcode有什么区别

1.== 用来比较两个对象的存储空间 2.equals是Object类提供的方法之一,每个java类都继承Object类,所以每一个对象都具有equals方法,所以在没有覆盖equals方法的情况下,equals与==运算一样,比较的是引用 所以要比较两个对象的内容 要重写equals()方法 3.hashCode()方法是区分两个对象是否相等,返回内存中地址转换成的一个int值 一般覆盖equals()也要覆盖hashCode()方法 equals相等 hashcode就相等 .equals不

java :equals()和hashcode()方法的结合使用

哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: 1 public native int hashCode(); 根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现. 为何Object类需要这样一个方法?它有什么作用呢?今天我们就来具体探讨一下hashCode方法. 一.hashCode方法的作用 对于包含容器类型的程序设计语言来说,基本上都会涉及到h

java equals()和hashCode()重写总结

在实际开发中有时候会遇到需要比较同一个类的不同实例对象的场景,一般情况下继承自Object父类的equals()和hashCode()可以满足需求,但却不能满足所有的场景,比如只需要使用少数几个对象属性来判断比较是否是同一个对象,这时我们就需要自定义的equals()和hashCode()实现来进行重写覆盖Object中的方法. 1. equals()方法重写注意事项 a. 自反性:对于任意的引用值x,x.equals(x)一定为true. b. 对称性:对于任意的引用值x 和 y,当x.equ

Java == ,equals 和 hashcode 的区别和联系

1. ==  java中的==是比较两个对象在JVM中的地址.比较好理解.看下面的代码: public class ComAddr{ public static void main(String[] args) throws Exception { String s1 = "nihao"; String s2 = "nihao"; String s3 = new String("nihao"); System.out.println(s1 ==

java中equals,hashcode和==的区别

1.== java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型 byte,short,char,int,long,float,double,boolean   他们之间的比较,应用双等号(==),比较的是他们的值. 2.引用类型(类.接口.数组) 当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false. 对象是放在堆中的,栈中存放的是对象的引用(地址).由此可见'=='是对栈中

Java中equals,hashcode,==的区别

==  :比较java栈局部变量表中变量的地址或值是否相等. equals : 比较变量的地址在java堆中引用对象是否为同一个对象. hashcode : 通过对象在JVM内存中的存储地址通过特定算法返回一个hash值,主要是配合HashSet HashMap进行增加.删除等. public native int hashCode(); 原文地址:https://www.cnblogs.com/JimKing/p/9536878.html

Java中==和equals的区别,equals和hashCode的区别

在java中: ==是运算符,用于比较两个变量是否相等. equals,是Objec类的方法,用于比较两个对象是否相等,默认Object类的equals方法是比较两个对象的地址,跟==的结果一样.Object的equals方法如下: public boolean equals(Object obj) { return (this == obj); } hashCode也是Object类的一个方法.返回一个离散的int型整数.在集合类操作中使用,为了提高查询速度.(HashMap,HashSet等

[转]Java中==和equals的区别,equals和hashCode的区别

在java中: ==是运算符,用于比较两个变量是否相等. equals,是Objec类的方法,用于比较两个对象是否相等,默认Object类的equals方法是比较两个对象的地址,跟==的结果一样.Object的equals方法如下: [java] view plain copy public boolean equals(Object obj) { return (this == obj); } hashCode也是Object类的一个方法.返回一个离散的int型整数.在集合类操作中使用,为了提

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

一.概述 1.概念 == : 该操作符生成的是一个boolean结果,它计算的是操作数的值之间的关系 equals : Object 的 实例方法,比较两个对象的content是否相同 hashCode : Object 的 native方法 , 获取对象的哈希值,用于确定该对象在哈希表中的索引位置,它实际上是一个int型整数 二.关系操作符 == 1.操作数的值 基本数据类型变量 在Java中有八种基本数据类型: 浮点型:float(4 byte), double(8 byte) 整型:byt