什么时候应该使用 ==?什么时候应该使用 Equals?

什么时候应该使用 ==?什么时候应该使用 Equals?

Equals 方法只是在 System.Object 中定义的一个虚拟方法,它由任何选择执行该任务的类所重写。== 运算符是一个可由类重载的运算符,该类通常具有恒等行为。

对于未重载 == 的引用类型,该运算符会比较两个引用类型是否引用同一对象,而这恰好是 System.Object 中的 Equals 实现所做的工作。

对于未重载 == 的值类型,该运算符会比较这两个值是否"按位"相等,即是否这两个值中的每个字段都相等。当您对值类型调用 Equals 时,仍然会发生这一情况,但这一次,该实现是由 ValueType 提供的,并且使用反射进行比较,从而使比较速度比特定于类型的实现慢很多。

到此为止,二者是如此类似。二者之间的主要区别是多态。运算符被重载而不是被重写,这意味着除非编译器知道调用更为具体的版本,否则它只是调用恒等版本。为阐明这一点,请看下面这个示例:

using System;
public class Test
{
static void Main()
{
// Create two equal but distinct strings
string a = new string(new char[] {'h', 'e', 'l', 'l', 'o'});
string b = new string(new char[] {'h', 'e', 'l', 'l', 'o'});
Console.WriteLine(a==b);
Console.WriteLine(a.Equals(b));
// Now let's see what happens with the same tests but
// with variables of type object
object c = a;
object d = b;
Console.WriteLine(c==d);
Console.WriteLine(c.Equals(d));
}
}

结果是:

True
True
False
True

第三行是 False,原因在于编译器不知道 c 和 d 的内容都是字符串引用,因而只能调用 == 的非重载版本。因为它们是对不同字符串的引用,所以恒等运算符返回 False。

那么,应该如何区别使用这些运算符呢?我的准则是:对于几乎所有引用类型,当您希望测试相等性而不是引用一致性时,请使用 Equals。例外的情况是字符串 - 使用 == 比较字符串确实会使事情简单得多,而且代码可读性更好,但是 您需要记住,该运算符的两端都必须是类型字符串表达式,才能使比较正常进行。

对于值类型,我通常使用 ==,因为除非值类型本身包含引用类型(这种情况极为罕见),否则是恒等还是相等的问题无关紧要。

[作者:Jon Skeet]

发布时间:2004 3 29 15:56:00 GMT 星期一 

<think>嗯,用户问的是“java==java”这样的写法是否正确。首先,我需要确定这个问题的上下文。Java中的“==”是用于比较两个变量的值,但如果是对象的话,比较的是引用而不是实际内容。所以用户可能是在比较字符串,或者在基本类型的情况下使用。 接下来,我应该考虑用户可能的场景。例如,他们可能在比较两个字符串变量,比如String a = "java"; String b = "java";然后使用a == b,这时候结果会是true,因为字符串常量池的原因。但如果用new String("java")创建对象,==就会返回false,因为引用不同。 然后需要解释正确的做法,即使用equals()方法来比较对象的内容,尤其是字符串。同时提醒基本数据类型(如int、char)可以直接用==,但对象类型不行。 还要注意用户可能的误解,比如认为==总是比较内容,但实际上不是。因此,需要详细说明不同情况下的结果,并给出示例代码帮助理解。 最后,确保回答结构清晰,分点说明,让用户能够逐步理解问题所在,并提供解决方案。同时检查是否遵循了系统级指令,比如数学公式的格式,但这里可能不涉及。使用中文,保持口语化,避免术语混淆。</think>在Java中,`java == java` 这种写法是合法的,但它的行为和结果取决于上下文。我们分步骤分析: --- ### 1. **基本数据类型比较** 若比较的是**基本数据类型**(如`int`, `char`等),`==` 用于直接比较值: ```java int a = 5; int b = 5; System.out.println(a == b); // 输出 true ``` 此时 `==` 是正确的用法。 --- ### 2. **对象类型比较** 若比较的是**对象**(如`String`、自定义类等),`==` 比较的是对象的**内存地址**(即是否为同一对象),而非内容: ```java String s1 = new String("java"); String s2 = new String("java"); System.out.println(s1 == s2); // 输出 false(地址不同) System.out.println(s1.equals(s2)); // 输出 true(内容相同) ``` 此时应使用 `.equals()` 方法比较内容。 --- ### 3. **字符串常量池的特殊情况** 对于字符串字面量,Java会通过**常量池**复用相同值的字符串: ```java String s3 = "java"; String s4 = "java"; System.out.println(s3 == s4); // 输出 true(常量池复用同一对象) ``` 虽然 `==` 返回 `true`,但这依赖于JVM优化,实际开发中仍建议用 `.equals()`。 --- ### 4. **总结:何时用 `==` 和 `.equals()`** | 场景 | 正确操作 | 示例 | |----------------------|-------------------|-----------------------------| | 基本数据类型比较 | `==` | `int a == int b` | | 对象内容比较 | `.equals()` | `s1.equals(s2)` | | 显式检查是否为同一对象 | `==` | `obj1 == obj2` | --- ### 最终结论 - `java == java` 的写法本身合法,但: - 如果是对象比较,需明确是否要比较内存地址。 - **推荐使用 `.equals()` 比较对象内容**,避免因内存复用导致的逻辑错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值