“==”和equals()

本文详细解析了Java中==操作符与equals方法的区别及应用场景。==用于比较基本类型值或引用是否相同;equals用于比较对象内容是否一致。强调了字符串比较应使用equals方法。

 

       ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同, 要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。

      如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存, 对象本身占用一块内存( 堆内存),变量也占用一块内存,例如 Objet obj = new Object();变量 obj 是一个内存,new Object()是另一个内存,此时,变量 obj 所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。equals 方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:

 

String a=new String("foo");
String b=new String("foo");

 

 

       两条 new 语句创建了两个对象,然后用 a/b 这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即 a 和 b 中存储的数值是不相同的,所以,表达式 a==b 将返回 false,而这两个对象中的内容是相同的,所以,表达式 a.equals(b)将返回true。

       在实际开发中,我们经常要比较传递进行来的字符串内容是否等,例如,

String input = …;input.equals(“quit”),许多人稍不注意就使用==进行比较了,这是错误的,随便从网上找几个项目实战的教学视频看看,里面就有大量这样的错误。记住,字符串的比较基本上都是使用 equals 方法。

如果一个类没有自己定义 equals 方法,那么它将继承 Object 类的 equals 方法, Object 类的 equals 方法的实现代码如下:

boolean equals(Object o){
return this==o;
}

    这说明,如果一个类没有自己定义 equals 方法,它默认的 equals 方法(从 Object 类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals 和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回 false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖 equals方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。                                                                                                       

### Java 中 `==` `.equals()` 的区别Java 编程语言中,`==` 运算符 `.equals()` 方法被广泛用于比较操作。然而,它们的功能适用场景存在显著差异。 #### 1. 基本概念 - **`==` 运算符**: 它是一种基本的比较运算符,在原始数据类型(如 int、char、boolean 等)之间执行值比较[^2]。对于对象引用而言,它会检查两个变量是否指向堆中的同一个内存地址[^1]。 - **`.equals()` 方法**: 这是一个方法,默认情况下继承自 `Object` 类。它的初始行为类似于 `==`,即仅当两个对象具有相同的引用时才返回 `true`。不过,许多类(例如 `String` 或 `Date`)都会覆盖此方法以提供基于内容的实际比较功能[^3]。 #### 2. 使用示例分析 以下是通过具体例子展示两者的行为: ```java // Example demonstrating == vs .equals() public class Main { public static void main(String[] args) { String s1 = new String("HELLO"); String s2 = new String("HELLO"); // Using == System.out.println(s1 == s2); // Output: false // Using .equals() System.out.println(s1.equals(s2)); // Output: true } } ``` 在这个程序里: - 当使用 `s1 == s2` 时,由于 `s1` `s2` 是不同的字符串实例(尽管字符序列相同),因此结果为 `false`。 - 对于 `s1.equals(s2)`,因为 `String` 类已重新实现了 `.equals()` 方法去对比实际的内容而非仅仅参照位置,所以这里得到的是 `true`[^5]。 #### 3. 特殊情况讨论 ##### (1)未重写的 `.equals()` 假如某个特定类型的类并未改写来自其超类的 `.equals()` 实现,则该函数的表现将完全等同于运用 `==` 执行参考一致性测试。 ##### (2)针对基础数据型态的应用 值得注意的是,`==` 不仅限于处理对象;它可以安全地应用于所有的简单数据类别之上,而这些场合下不存在所谓的 `.equals()` 替代方案。 #### 4. 总结建议 鉴于上述特性上的异同点,在日常编码实践中应当依据具体情况选用恰当的方式完成必要的判定工作。通常来说,当我们关心逻辑意义上的平等关系——也就是关注事物本身的属性或者状态一致与否的时候,应该优先考虑采用 `.equals()` 函数形式表达我们的意图;反之若是单纯追求物理层面的一致性确认的话,则可以直接利用简洁明了的双等于号语法结构即可达成目的[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值