什么时候应该用equals(),什么时候应该用==

Java对象比较详解
本文详细解析了Java中equals与==的区别及使用场景,包括基本数据类型、引用类型、String类型等,并探讨了自定义类中equals与hashCode方法的重写问题。

本人小白一枚最近这一部分比较晕,所以自己就仔细研究了一下

我结合网上和自己的理解总结了一些,如果我说的有问题,也请大家及时提醒,不足或漏说的地方愿大家积极

补充以供更多小白得到帮助,在此谢谢大家了!



1、equals是object的方法


2、String类型的
equals重写了object的方法,所以此方法比较的是内容,不比较内存地址
==比较内容和地址,因为String也属于引用数据类型
注意:String是特殊的在声明对象时可以写new也可以不写(不写默认就是new)
(总结:==比较内存地址和内容,equals方法被重写只比较内容)


3、基本类型,如int,char,long,boolean。
没有equals方法,只有==只比较值,因为基本数据类型存在栈里也不能new,最关键的一点是只有对象才能调方法
(总结:基本数据类型只有==进行比较,只比较值)


4、引用数据类型,如Integer,Byte,Long,Character,Boolean
引用数据类型是可以new的,而new出来的对象都会在堆中有开辟一个内存地址空间
通常用==比较对象时,比较的就是内存地址和内容
equals是用==判断两个对象是否相等,比较内存地址和内容,当两者都相等时才返回真
(总结:引用数据类型除String特殊外,equals和==都比较内存地址和内容)




以上是我个人的总结,如有错误或不足请大家及时指出!


下面我有几个问题
1.如果我有一个自定义类对象stu

那么我比较两个对象是否相等,在没重写equals和hashcod方法时,是否用equals和==都可以?(是)



2.如果我比较这个对象中的某个属性是否等于某内容时,这个比较是否就要看我自定义类中的属性类型了?(如果说其中的属性是基本数据类型就只能用==比较值。如果是引用数据类型equals和==都行,比较内存地址和内容。如果是String类型equals比较内容,==比较内存地址和内容)



Java中,重写 `equals` 方法是为了根据对象的实际内容而非内存地址来判断对象的相等性。以下是一些需要重写 `equals` 方法的典型场景: 1. **自定义类**:当定义一个类并希望根据对象的属性值来判断两个对象是否相等时,需要重写 `equals` 方法。例如,对于一个 `User` 类,如果两个用户的 `id` 和 `name` 相同,则可以认为这两个对象是相等的。默认的 `equals` 方法仅比较对象的内存地址,无法满足这种需求。 ```java public class User { private int id; private String name; // 构造方法、getter和setter省略 @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; User other = (User) obj; return id == other.id && name.equals(other.name); } } ``` 2. **集合类的使用**:当将自定义类的对象存储在基于集合的结构(如 `HashSet`、`HashMap` 等)中时,需要重写 `equals` 方法以确保集合能够正确识别重复元素或键。如果未重写 `equals`,集合会依赖默认的地址比较,导致无法正确识别内容相同的对象[^2]。 3. **字符串类的内容比较**:对于 `String` 类,`equals` 方法已经被重写以比较字符串的实际内容,而不是引用地址。例如,`"hello".equals("hello")` 返回 `true`,即使它们是两个不同的对象实例。这是为了确保字符串的逻辑相等性。 4. **数组内容的比较**:对于数组,可以使用 `Arrays.equals()` 方法来比较数组的内容是否相等。如果直接使用默认的 `equals` 方法,它会比较数组的引用地址,而不是内容。因此,在自定义包含数组的类时,可能需要重写 `equals` 方法以确保数组内容的正确比较[^1]。 5. **枚举类的特殊需求**:虽然枚举类的 `equals` 方法默认实现通常已经足够,但在某些特殊情况下,可能需要根据业务逻辑重写 `equals` 方法,以支持更复杂的相等性判断。 6. **保证与 `hashCode` 的一致性**:当重写 `equals` 方法时,必须同时重写 `hashCode` 方法。这是因为 Java 规定,如果两个对象通过 `equals` 方法判断为相等,那么它们的 `hashCode` 必须相同。否则,基于哈希的集合(如 `HashMap` 和 `HashSet`)将无法正确工作[^3]。 ### 示例:重写 `equals` 和 `hashCode` ```java @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; User user = (User) obj; return id == user.id && Objects.equals(name, user.name); } @Override public int hashCode() { return Objects.hash(id, name); } ``` ###
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值