Java ==,和equals的区别,以及hashCode方法的本质和注意事项

1. java中的数据类型

java的数据类型大概可以分为两类:

1.1 基本类型

byte,short,char,int,long,float,double,boolean。

变量的初始化:不需要使用new关键字

int a;  // 开辟了一个名为a的内存空间
int a = 1; // 开辟了一个名为a的内存空间并赋值为1

他们之间的比较,应用双等号(==),比较的是他们的值。

1.2 类

如array, String等都是类。

类的初始化:

int[]  a; // 声明了数组变量a,它是**指向某个数组的引用(指针)。**
int[]  a = new int[10]; //声明了数组引用a, 并在内存中开辟了一个10 int大小的数组,并让a指向此内存空间

当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址)。
注:对于第二种类型,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。因为每new一次,都会重新开辟堆内存空间。

2. Object.equals && Object.hahscode

Object.equals的实现:
Object a = new Object();
Object b = new.Object();
a.equals(b); 等价于 return (a == b);
也就说看两者的内存地址是否相等。

Object.hashcode的实现:
根据源码,Object.hashcode的计算方法有好几种,但是都遵循以下规范:

  1. 同一对象(内存地址相同)的hashcode一定相同, 不同地址的两个对象的hashCOde极大概率不同。

3.一般的equals方法和hashCode方法

3.1两者的关系

若在Object的子类中对equals方法进行了重写,则必须对equals方法也重写,以保证当equals方法返回true时,两个对象调用hashcode方法的返回值一定相等。(为了hashset里两个相等对象一定寻到的是同一位置)

3.2方法的重写

String 、Math、Integer、Double等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法。它们不再根据内存地址而是根据内容来判断两者是否相等。因此hashcode方法也重写了,两个内容相等的String 、Math、Integer、Double等对象的hashcode一定相等。

3.3Integer.hashCode和Double.hashCode

如果要返回int / double等基本类型的hashcode,需要先转换为对应的封装类。

double a = 1;
((Double) a).hashCode();

而Integer和Double类提供了静态方法可以不用进行类型转换直接返回。

double a = 1.0;
Double.hashCode(a);

4. Objects.hashCode与Objects.hash

Objects类提供操作对象的一组静态方法

Objects.hashCode(a) **等价于a.hashCode(), 也可以直接用于int,double等基本类型。**另外当a == null, 返回0, 十分安全。

如果某个类的hashCode要由它的几个实例域一起决定,可以调用Obects.hash(a, b, c, …). 它对Object.hashCode(a), Object.hashCode(b)…进行组合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值