String类中重写Object中的equals方法源码解析
一、Object类中的equals方法:
public boolean equals(Object obj) {return (this == obj);}
由上面的代码可以看出,Object类中的equals方法比较的是地址,注意==对于引用类型比较的是地址,对于基本数据类型比较的是值。
二、String类中的equals方法源码解析
1、首先先创建一个测试类,方便解析,代码及其运行结果如下:
public class Test {public static void main(String [] args) {String str1="Tom";String str2="Tom";System.out.println(str1.equals(str2));//语句1System.out.println(str1.equals(new Date()));//语句2System.out.println(str1.equals(new String("Tom")));//语句3}
}
运行结果:
true
flase
true
2、String类中equals方法源码:
public boolean equals(Object anObject) {if (this == anObject) {return true;}if (anObject instanceof String) {String anotherString = (String)anObject;//这里是下转型对象,将Object类变成String类,这样才能调用子类所新增的属性和方法,如下面出现的value是String类中新增的成员变量,如果不下转型是无法使用value这一变量的int n = value.length;//此处应该是this.value.length,也就是str1字符所构成数组的长度if (n == anotherString.value.length) {char v1[] = value;//value是字符数组char v2[] = anotherString.value;int i = 0;while (n-- != 0) {if (v1[i] != v2[i])return false;i++;}return true;}}return false;}
需要注意的是String类中equals方法出现的value,是String新增的属性,代码如下:
private final char value[];//字符数组
3、测试类中语句执行顺序
①语句1:执行语句1的时候,先比较str1与str2的地址是否相同,经比较地址是相同的,返回true;
②语句2:执行语句2的时候,同样先比较地址,经比较地址是不同的,就继续往下执行,然后通过anObject instanceof String比较new Date()是否是String类创建的,很显然不是,返回false;
③语句3:执行语句3的时候,同样先比较地址,经比较地址是不同的,就继续往下执行,然后通过anObject instanceof String比较new String("Tom")是否是String类创建的,很显然是的,然后就继续执行该if语句里面的内容,首先进行下转型,然后得到str1的字符数组的长度,再通过一个if比较str1与new String("Tom")的字符数组的长度,经比较长度是相同的, 就开始进行数组遍历,逐一比较每个字符是否一样,一旦发现不同,则返回false,经比较str1与new String("Tom")的内容是 一致的,因此返回true。
三、总结
1、Object中的equals方法比较的是地址;
2、String类中的equals方法比较的是内容是否相同,其源代码的执行顺序为:
String类中重写Object中的equals方法源码解析相关推荐
- c#equals方法源码_C#中的Int32.Equals()方法示例
c#equals方法源码 Int32.Equals()方法 (Int32.Equals() Method) This method is used to compare two integer obj ...
- python处理回显_Python中getpass模块无回显输入源码解析
本文主要讨论了python中getpass模块的相关内容,具体如下. getpass模块 昨天跟学弟吹牛b安利Python标准库官方文档的时候偶然发现了这个模块.仔细一看内容挺少的,只有两个主要api ...
- String str = new String(abc)创建了几个对象?结合源码解析
String str = new String("abc")创建了几个对象?结合源码解析 首先,我们看一下jdk源码: 1 /** 2 * Initializes a newly ...
- Redis源码-String:Redis String命令、Redis String存储原理、Redis String三种编码类型、Redis字符串SDS源码解析、Redis String应用场景
Redis源码-String:Redis String命令.Redis String存储原理.Redis String三种编码类型.Redis字符串SDS源码解析.Redis String应用场景 R ...
- String equals()方法 源码分析
public boolean equals(Object anObject) {// ==:比较的引用类型,比较的是地址值是否相同if (this == anObject) { //地址值相等,返回t ...
- 0基础快速入门CSS技术栈(5)—图解详细阐述说透CSS的盒子模型(超级重要)、圆角边框、盒子阴影及相关重要的笔试题——css的核心中的核心(附详细案例源码解析过程)2021.01.07更新
文章目录 1. 盒子模型(CSS重点) 1.1 看透网页布局的本质 1.2 盒子模型(Box Model) 1.3 盒子边框(border) 1.3.1 边框综合设置 1.3.2 example01 ...
- 【SpringBoot系列】 Spring中自定义Session管理,Spring Session源码解析
系列文章:Spring Boot学习大纲,可以留言自己想了解的技术点 目录 系列文章:Spring Boot学习大纲,可以留言自己想了解的技术
- (十三)Java工具类StringUtils中strip、stripStart、stripEnd剥离方法源码详解
1. strip方法源码解析 public static String strip(String str){return strip(str, null);} 源码解析:调用strip方法,参数是字符 ...
- java.lang 源码剖析_java.lang.Void类源码解析
在一次源码查看ThreadGroup的时候,看到一段代码,为以下: /* * @throws NullPointerException if the parent argument is {@code ...
- 在HashSet集合中添加三个Person对象,把姓名相同的人当作同一个人,禁止重复添加。 提示:Person类中定义name和age属性,重写hashCode()方法和equals()方法,针对Pe
题目: 在HashSet集合中添加三个Person对象,把姓名相同的人当作同一个人,禁止重复添加. 提示:Person类中定义name和age属性,重写hashCode()方法和equals()方法, ...
最新文章
- JavaScript 简史
- Bug整理——$(window).height()获取到$(document).height()的问题
- CRM Mock framework debug
- 马尔可夫Markov决策过程 MDP、马尔可夫奖励过程MRP
- JavaScript窗体控制函数
- linux可用机场客户端,Linux系统可用的6款Bittorrent客户端
- 高并发下的 HashMap 为什么会死循环
- 129_Power PivotPower BI DAX不同维度动态展示动态坐标轴
- 数字图像处理 频率域平滑 MATLAB实验
- 类似clover的软件_Clover 我的电脑里的书签栏
- 火狐浏览器去除广告插件
- gw node节点 xshell连接 访问外网
- 函数发生器输出电压值会与设定值不同
- 雷神电脑 ST-plus windows10+ubuntu16.04 双硬盘 双系统超详细安装
- 2NE1 AON北京演唱会
- 双线双IP空间或者服务器域名解析说明
- Autosar Configuration(五) Security之Csm配置
- 10代cpu能装服务器系统不,第10代CPU可以装Windows7吗
- 字节跳动2018校招前端方向(第三批)题目3
- dubbo的简单搭建