Java中相等的判断(equals 和 ==)

本文深入探讨Java中equals方法与==操作符的区别,通过代码示例解释它们在基本数据类型与其他数据类型如String和Object中的行为差异。equals用于值的比较,而==则用于比较对象的引用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前有看过一些关于equals和==

的比较的问题,但是自己没有做过总结总感觉记不住也理解不了,所以我认为最好的学习方法还是要自己总结一遍。想弄清楚这个问题,我认为需要分为基本数据类型和其他数据类型、类来看。 首先来看一下基本数据类型在这个问题中的表现,首先我们需要了解,”.”点运算符只能用于类的成员或者方法,所以基本的数据类型(逻辑型boolean,字符型char,整型byte,short,int,long,浮点型float,double)都不能使用.equals进行判断,此时只能使用“”进行判断,此时“”的意义只是数字上的和字符上的相等。 再来看看其他的数据类型在这个问题上的表现,其中最为代表性的就是String这个既不是基本的数据类型但是却非常频繁的被使用的这么一种数据结构,先对“

”进行测试,代码如下:

String sentence1 = “例句”;
String sentence2 = “例句”;
System.out.println(sentence1 == sentence2);//true
System.out.println(sentence1.equals(sentence2));//true

“==”和“.equals()”的情况一样其结果为true。其实这个时候我是很疑惑的,为什么他们的结果都是相同的呢?在java.lang.String的源码中,“.equals”方法是这样被定义的:

public boolean equals(Object anObject) {
if (this == anObject) {
return true;//如果调用.equals()方法中的参数是本身,则返回true
}
if (anObject instanceof String) {
String anotherString = (String)anObject;//不太懂为什么这个地方要强制类型转换??
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}

所以可以从源码中看到,实际上.equals是在进行值的分析(一个一个char进行比较)。而我推测“==”是专门用于地址的比较。我用了下面的代码进行证明

String sentence1 = new String(“a”);
String sentence2 = new String(“a”);
System.out.println(sentence1 == sentence2);//false
System.out.println(sentence1.equals(sentence2));//true
sentence1 = sentence2;//此时让两个例句的地址相等
System.out.println(sentence1 == sentence2);//true

这几天又遇到新的问题:既然String是这样,那Object又如何呢?
秉承着有源码看源码的思想,找到代码如下:

public boolean equals(Object obj) {
return (this == obj);
}

在Object类的源码中,找到这样一行代码,this==obj,OMG难道可以这么偷懒的吗,所以我们也就知道了,在Object中的equals方法和String方法不同,Object中的equals方法是比较地址是否相同,我们用代码来验证一下:

Object o1 = new Object();
Object o2 = new Object();
System.out.println(o1.equals(o2));//false

我们先创建了两个“相同的”空对象,然后用.equals进行比较,结果是false,也证实了我们的猜想。
总结一下:.equals()用于判断值,==用于判断地址。

版权声明:本文为优快云博主「可爱滴老唐」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/weixin_40134367/article/details/79472185

### Java 中 `equals` 方法 `==` 运算符的区别 在 Java 编程语言中,`equals()` 方法用于比较两个对象的内容是否相等,而 `==` 运算符则用来判断两个引用变量是否指向同一个内存地址。 对于基本数据类型的比较: - 使用 `==` 来直接对比数值大小。 对于对象类型的数据比较: - 如果使用 `==` ,那么是在检查这两个对象实例是否完全相同,即它们是否位于同一位置存储于堆空间内[^1]。 - 当调用 `equals()` 方法时,默认情况下它会执行与 `==` 类似的操作;但是通常建议重写此方法以便能够基于实际属性来评估逻辑上的平等关系。例如,在 String Wrapper 类(Integer, Double 等)中已经实现了合理的 `equals()` 行为[^2]。 下面是一个简单的例子展示两者的不同之处: ```java String s1 = new String("hello"); String s2 = new String("hello"); System.out.println(s1 == s2); // false, because they are different objects in memory. System.out.println(s1.equals(s2)); // true, since content of both strings is same. // For primitive types like int or char '==' compares their values directly int num1 = 5; int num2 = 5; System.out.println(num1 == num2); // true as integers have equal value here. ``` 当准备面向对象编程的面试题目时,关于 `equals` 对比 `==` 的常见问题可能包括但不限于以下几点: - 解释为什么即使字符串具有相同的字符序列,`==` 返回的结果可能是 `false`. - 描述如何正确地覆盖 `Object` 类中的 `equals(Object obj)` 方法以确保其遵循通用约定。 - 讨论如果自定义类未适当覆写 `equals()` 可能引发的问题以及解决方案。 - 探讨哈希表结构如 `HashMap`, `HashSet` 如何依赖 `equals()` `hashCode()` 方法来进行键查找并保持唯一性约束[^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值