Java基础知识模块

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、Java基础

1.Java中hashCode() 和 equals() 和==的关系

"=="运算符
在Java中,是一个二元运算符,用于比较两个变量的值。
当比较的是基本数据类型(如int,float,char等)时,"
“比较的是它们的值是否相等。
当比较的是引用类型(如对象),”=="比较的是它们引用的是否是同一个对象,也就是说,它比较的是对象在内存中的地址。

equals()方法
equals()方法用于检查两个对象在逻辑上是否相等。它在Object类中定义,可以在任何Java类中使用。

默认情况下,Object类的equals()方法和"=="运算符的行为是一样的,也就是说,它比较的是两个对象的引用是否相同。但是,许多类(如String、Integer、Date等)都重写了equals()方法,以实现基于内容的比较。在这些类中,如果两个对象的内容相同,那么equals()方法就会返回true,即使它们是两个不同的对象。

hashCode()方法
hashCode()是一个Java方法,用于获取对象的哈希码。哈希码是一个整数,通常是对象内存地址的某种变换。它在Object类中定义,和equals()一样,可以在任何Java类中使用。

默认情况下,Object类的hashCode()方法返回的是对象的内存地址。但是,许多类也重写了hashCode()方法,以返回一个基于对象内容的值。

hashCode()方法在散列数据结构(如HashMap、HashSet等)中非常重要,这些数据结构使用哈希码来确定对象在内存中的存储位置。

hashCode()、equals() 和"=="的关系
在理解了hashCode()、equals() 和"=="之后,我们可以看到它们之间的关系:

**一致性:**如果两个对象在equals()方法的意义下是相等的,那么它们的hashCode()方法必须返回相同的值。这是因为散列数据结构依赖于这个规则。

**不对称性:**如果两个对象的hashCode()相同,那么它们并不一定相等。这是因为不同的对象可能会有相同的哈希码,这种现象称为哈希碰撞。

"=="和equals()的区别:
“== " 比较的是对象的引用,而equals()比较的是对象的内容。对于同一个对象,”== “和equals()都会返回true,但对于内容相同的两个不同对象,”=="会返回false,而equals()可能会返回true,具体取决于equals()方法是否被重写。


是的,完全有可能存在两个对象的hashCode相等,但是"=="比较不相等的情况。这主要是因为hashCode方法产生的是一个int类型的哈希值,而Java中的对象远远超过int所能表示的范围,所以不同的对象可能产生相同的哈希值,这种现象被称为哈希冲突。

hashCode相等 ;==不相等;则equals可能相等

String s1 = new String("hello");
String s2 = new String("hello");

System.out.println(s1.hashCode());  // 输出 99162322
System.out.println(s2.hashCode());  // 输出 99162322

System.out.println(s1 == s2); // 输出 false
System.out.println(s1.equals(s2)); // 输出 true

如上,s1和s2是两个不同的对象(即它们在内存中的位置不同),所以使用"=="进行比较时结果为false。但是它们的内容是相同的,所以它们的hashCode值相同,equals方法也返回true。

总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值