关于==和equals的区别

本文通过三个Java示例程序探讨了对象引用与值相等性的区别。重点解析了使用'=='与'.equals()'方法的不同之处,并提出了对于不同情况下比较对象相等性的理解疑问。

背景:今天开始暑期软工实习课程。看到ppt上的这个知识点有点毛了。

 有三段代码:

 //: c03:Equivalence.java 

                                     

 输出:false 

          true

//: c03:EqualsMethod.java

 
输出:true
//: c03:EqualsMethod2.java

 

输出:false

 

起初着实不懂,找到网上类似的文章:http://www.cnblogs.com/oldjacky/articles/66604.htmlhttp://topic.youkuaiyun.com/u/20071208/17/91362954-7913-4ece-8c18-3b6971a50e4d.html

很不懂,对第一段程序,由结果推,n1、n2是引用类型(虽然不知道为什么,囧),而且不是同一引用,所以才会是fauls。对第二段程序,同样是引用类型,不清楚equals是看引用所对应的值是否相等还是引用是否相等。现在分两种情况:

一、如果是看引用本身的话,那么由2结果,两者是同一引用,与第一个程序矛盾;

二、如果是看引用所对应的值的话,确实为true,对第三个程序,那也应该为true啊,为什么结果是faulse呢?

 

极度矛盾和迷惑中。。。。。。。。。。。。。。

 

 

 

### Java 中 `==` 运算符与 `equals()` 方法的区别 在 Java 中,`==` `equals()` 是用于比较对象或基本类型值的两种机制,但它们的行为适用场景存在本质区别。 #### 基本数据类型的比较 对于基本数据类型(如 `int`、`float`、`char` 等),`==` 用于比较两个变量的值是否相等。例如: ```java int a = 10; int b = 20; int c = 10; System.out.println(a == b); // false System.out.println(a == c); // true ``` 在上述代码中,`==` 直接比较的是 `int` 类型变量的数值,而不是内存地址,因此适用于基本数据类型[^3]。 #### 引用类型的比较 对于引用类型(如 `String`、`Object` 等),`==` 比较的是两个对象在内存中的地址是否相同,而不是它们的内容。例如: ```java String str1 = new String("hello"); String str2 = new String("hello"); System.out.println(str1 == str2); // false ``` 尽管 `str1` `str2` 的内容相同,但由于它们是两个不同的对象,分别位于堆内存中的不同位置,因此 `==` 返回 `false`[^2]。 #### `equals()` 方法的默认行为 `equals()` 是 `Object` 类中定义的方法,所有 Java 类都继承了该方法。在未被重写的情况下,`equals()` 默认比较的是对象的内存地址,其行为与 `==` 一致。例如: ```java Object obj1 = new Object(); Object obj2 = new Object(); System.out.println(obj1.equals(obj2)); // false ``` 然而,某些类(如 `String`)重写了 `equals()` 方法,使其比较的是对象的内容,而非内存地址[^4]。 #### `equals()` 方法的重写行为 以 `String` 类为例,其 `equals()` 方法被重写,用于比较两个字符串是否表示相同的字符序列: ```java String str1 = "hello"; String str2 = "hello"; System.out.println(str1.equals(str2)); // true ``` 在此示例中,`str1` `str2` 是字符串常量池中的同一个对象,因此 `equals()` 返回 `true`。即使两个字符串是通过 `new` 创建的,只要内容相同,`equals()` 也会返回 `true`: ```java String str1 = new String("hello"); String str2 = new String("hello"); System.out.println(str1.equals(str2)); // true ``` 这表明 `equals()` 的行为取决于类是否重写了该方法,而非其默认实现[^1]。 #### 特例:字符串常量池 Java 中的字符串字面量会被存储在字符串常量池中,相同内容的字符串字面量会共享同一个内存地址。例如: ```java String s1 = "abc"; String s2 = "abc"; System.out.println(s1 == s2); // true ``` 在此情况下,`==` 比较的是内存地址,由于两个字符串共享同一内存地址,因此返回 `true`。这一特性是字符串常量池优化的结果。 #### 总结 - `==` 是运算符,用于比较基本数据类型的值或引用类型的内存地址。 - `equals()` 是对象方法,默认比较内存地址,但可通过重写实现内容比较。 - 在比较对象内容时,应优先使用 `equals()` 方法,尤其是在处理字符串等常用类时。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值