Java 中的比较 equals 和 ==

这个问题在 Java 面试的时候大概率会被问到。

不是因为这个问题有什么复杂的,只是因为这个地方超出人类认知,你相信吗?

比较什么

如果你上培训班或者在学校学习的话,你的老师大概率可能会告诉你对于:

  • 基本类型:比较的是值是否相同;
  • 引用类型:比较的是引用是否相同;

本来这里就有点复杂了,还非要搞出另外 2 个概念。

比较好记的就是 == 比较的是内存地址,equals 比较的是具体的值。

对上面的问题,所谓的基本类型,因为没有对象话,所以 JVM 没有为基本类型创建实例化后的对象,因此 == 就可以直接用了,因为 2 个相同的基本类型的值的地址是一样的。

String 为什么不行

String 在 Java 里面有点奇葩,因为 String 是在是用得太多了。

所以 Java 为 String 搞了一个 String Pool,对于程序中,你这样定义的字符 String s1 = "iSharkFly";这个数据是存储在 String Pool 里面的。

因为 String 在 Java 里面被定义为不可变。等下一次你定义一个 s2 的时候,如果是同样的值, s1 和 s2 是相同的,因为都在 String Pool 里面。

String 还有另外一个初始化方法:` String s1 = new String("iSharkFly");

这个方法初始化的 String 是一个对象,这个对象没有放在 String Pool 里面,这个对象在 Heap 内存中。

所以:

复制代码
        String s1 = new String("iSharkFly"); 
        String s2 = new String("iSharkFly");

的内存地址是不相同的,但是值相同。

使用 == 比较,上面就没有办法比较。

查看下面的代码:

复制代码
        String s1 = new String("iSharkFly");
        String s2 = new String("iSharkFly");
        log.debug("hashCode - {}", s1.hashCode());
        log.debug("hashCode- {}", s2.hashCode());
        log.debug("identityHashCode- {}", System.identityHashCode(s1));
        log.debug("identityHashCode - {}", System.identityHashCode(s2));

程序输出:

我们会看到地址是不相同的。

hashCode

都知道 hashCode 会返回对象的 HashCode 来识别对象,为什么上面的地址是一样的?

因为 hashCode 会在程序中被重写。

下面的是 String 的 HashCode 代码。

JDK 已经对代码进行了重写。所以 hashCode 并不能完全标识内存地址

所以,我们只能使用 System.identityHashCode 方法来获得内存地址。

总结

equals 和 == 在 Java 面试中经常会遇到。

只需要记住的是 == 比较的是内存地址,在对值进行比较的时候并不可靠。

在实际编码过程中,这种比较也比较常见的,所以还是有必要了解下这个。

Java 中的比较 equals 和 == - Java - iSharkFly

相关推荐
IvorySQL8 分钟前
云环境下PostgreSQL的Cgroup内存管理实践
java·数据库·postgresql
不定积分要+C_yyy9 分钟前
Java基础核心精讲:基本数据类型与包装类区别、自动装箱拆箱与缓存陷阱实战解析
java·开发语言
jvmind_dev10 分钟前
第三章:GC 日志深度分析(上)——多版本、多收集器的统一解析
java·agent
xingxiliang12 分钟前
ReliableAgent:类似工程级可用的agent示例
java·开发语言·agent
亦暖筑序24 分钟前
AgentScope-Java 入门:保存评审状态并生成 Markdown 报告
java·人工智能·后端
buhuizhiyuci26 分钟前
【python篇——一周速通python语法】python的基础语法操作
开发语言·python
程序猿编码36 分钟前
没有AI框架,没有GPU,一个C语言文件跑通大模型
c语言·开发语言·人工智能·深度学习·ai·大模型
zmzb010342 分钟前
C++课后习题训练记录Day160
开发语言·c++
invicinble42 分钟前
关于微服务基本框架搭建--fegin最小使用demo
java·spring boot·微服务
梦想的旅途243 分钟前
企业微信API 实现企业微信消息的自动发送?
java·服务器·前端