Java常见面试题 -- 对象相等

== 和 equals 的区别

== 解读

对于基本类型来说:比较的是值是否相同

String s1="abc";
String s2="abc";
char [] biu={'a','b','c'};
String s3=new String(biu);
System.out.println(s1==s2);//输出结果 true
System.out.println(s1==s3);//输出结果 false
System.out.println(s3==s2);//输出结果 false

对于引用类型来说:比较的是引用是否相同
在这里插入图片描述
equals 解读

equals 本质上就是 ==,只不过 String 和 Integer 等重写了 equals 方法,把它变成了值比较。看下面的代码就明白了

String  s1="shw";
String  s2="shw";
char [] s3={'s','h','w'};
String biu=new String(s3);
System.out.println(s1.equals(s2));//true
System.out.println(s2.equals(s3));//false
System.out.println(s1.equals(s3));//false
class Cat {
public Cat(String name) {
this.name = name;
}
private String name;
public String getName() {
 return name;
}
public void setName(String name) {
 this.name = name;
 }
}
Cat c1 = new Cat(“哈尼”);
Cat c2 = new Cat(“哈尼”);

System.out.println(c1.equals(c2)); //输出结果 false
//输出结果出乎我们的意料,竟然是 false?这是怎么回事,看了 equals 源码就知道了,源码如下:

public boolean equals(Object obj) {
return (this == obj);
}
//原来 equals 本质上就是 ==。
//那问题来了,两个相同值的 String 对象,为什么返回的是 true?代码如下:
String s1 = new String(“老王”);
String s2 = new String(“老王”);
System.out.println(s1.equals(s2)); // true
//是 String 重写了 Object 的 equals 方法,把引用比较改成了值比较。

两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?

不对,两个对象的 hashCode() 相同,equals() 不一定 true。

String str1 = “通话”;
String str2 = “重地”;
System. out. println(String. format("str1:"+str.hashCode()+"|"+"str2:"+ str2. hashCode())
System. out. println(str1. equals(str2));
/*
输出结果显示
str1:1179395 | str2:1179395
false
*/

很显然“通话”和“重地”的 hashCode() 相同,然而 equals() 则为 false,因为在散列表中hashCode() 相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等。

hashCode 和 equals 区别

equals

equals 是 Java提供给程序员对比两个对象什么时候相等,什么时候不相等。重写 equals方法定义对比规则,判断是否相等。如果不重写,则默认使用 object 中的 equals。它是 == 对比的是对象在栈中的引用地址值。如果对比的是基本类型变量的话,对比的是栈中的值。一般来说,String 它就会重写 equals方法。还有普通对象,对比的时候值只对比成员变量,也可以重写equals,定义对比规则。

hashCode

hashCode ( ) 的 作用获取哈希码,也称 散列码 ;它实际是返回一个int整数。这个哈希码的作用是确认该对象在哈希表中的索引位置。hashCode ( ) 定义在 JDK 的 Object.java 中Java的任何类都包含有hashCode( )函数。散列表存储的是键值对(key - values),它的特点是 : 能根据 “键”快速的检索出对应的“ 值 ”。这其中就利用到了散列码!( 可以快速找到所需要的对象 )

为什么要有 hashCode ?

以 “ HashSet 如何检查重复 ”为例子来说明为什么要有 hashCode:

对象加入 HashSet时,HashSet会先计算对象的 hashCode值来判断对象加入的位置,看该位置是否有值,如果没对象、HashSet 会假设对象没有重复出现。但是如果发现有值,这时会调用equals ( ) 方法来检查两个对象是否真的相同。如果两者相同,HashSet 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。这样就大大减少了equals 的次数,相应就大大提高了执行速度。

在这里插入图片描述
hashCode( )与equals( )的相关规定

  • 如果两个对象相等,则hashcode一定也是相同的

  • 两个对象相等,对两个对象分别调用 equals 方法都返回 true

  • 两个对象有相同的 hashcode 值,它们也不一定相等的

  • 因此,equals方法被覆盖过,则 hashcode 方法也必须被覆盖

  • hashCode ( )的默认行为是对堆上的对象产生独特值。如果没有重写 hashCode ( ),则该 class 的两个对象无论如何都不会相等(即使这两个对象指向相同的数据 )

对象的相等与指向他们的引用相等,两者有什么不同?

对象的相等 比的是内存中存放的内容是否相等而 引用相等 比较的是他们指向的内存地址是否相等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

眼里只有码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值