区别
定义
点击查看详细代码
| |
| |
| |
| public boolean equals(Object obj) { |
| return (this == obj); |
| } |
| |
- String类继承了Object类,重写了Object类的equals(),比较的是对象的值和hasCode码
点击查看详细代码
| |
| |
| |
| public boolean equals(Object anObject) { |
| if (this == anObject) { |
| return 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(),必须重写hashCode()
测试
点击查看详细代码
| |
| |
| |
| |
| public class User { |
| private String name; |
| private int age; |
| |
| public User(String name, int age) { |
| this.name = name; |
| this.age = age; |
| } |
| |
| |
| @Override |
| public boolean equals(Object obj) { |
| if(obj instanceof User) { |
| User u = (User)obj; |
| if(this.name != null && this.name.equals(u.name) && this.age == u.age) { |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| @Override |
| public int hashCode() { |
| return this.age * 30; |
| } |
| |
| public static void main(String[] args) { |
| User user1 = new User("二狗", 12); |
| User user2 = new User("二狗", 12); |
| System.out.println(user1 == user2); |
| System.out.println(user1.equals(user2)); |
| System.out.println("usur1:" + user1.hashCode() + " " + "user2:" + user2.hashCode()); |
| System.out.println("user1内存地址:" + user1 + " " + "user2内存地址:" + user2); |
| } |
| } |
- 未重写equals()时运行结果:new对象user1和user2变量名称存放在栈内存中,这两个对象分别指向存放在堆内存中的数据,==比较的是内存地址,所以为false,object类的equals()比较的是内存地址,所以为false
| false |
| false |
| usur1:460141958 user2:1163157884 |
| user1内存地址:chx.User@1b6d3586 user2内存地址:chx.User@4554617c |
- 重写equals()之后的运行结果:栈内存中的变量user1指向堆内存中的user1数据,栈内存中的变量user2指向堆内存中的user2数据,==比较的是内存地址,所以为false,重写equals()后堆内存中user2的数据指向栈内存中user1的引用,栈内存中user1和user2都指向堆内存中user1的数据,比较内存地址是一致,所以是true
| false |
| true |
| usur1:360 user2:360 |
| user1内存地址:chx.User@168 user2内存地址:chx.User@168 |
重写equals()之后的比较的是hashCode码和内存地址,所以返回的结果为true
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术