一,前言:

我们都知道String的equals方法,是用来比较两个字符串的内容是否是相等的

如果比较内存地址用的是==。

那么String的equals方法是如何来比较两个字符串的内容是否是相等的呢?

今天一起翻翻源码看看:

·

二,源码解析:

public boolean equals(Object anObject) {//如果指定对象和当前对象的内存地址相等,则啥都不用说了,在内存中都是同一个对象了,直接返回true;if (this == anObject) {return true;}//如果指定对象和当前对象的内存地址不相等://则判断指定对象是否是String类型,如果不是,则直接返回false;//如果指定对象是String类型,则继续:if (anObject instanceof String) {//则先将该对象强转为String对象:String anotherString = (String)anObject;//比较指定对象与当前对象的字符串长度,如果长度不一致,则直接返回false;int n = value.length;      if (n == anotherString.value.length) {//如果指定对象与当前对象的字符串长度一致,//则遍历这两个字符串对象中的每一个char字符,//如果遍历过程中有一个char字符不一致,则直接返回false;char v1[] = value;char v2[] = anotherString.value;int i = 0;while (n-- != 0) {if (v1[i] != v2[i])return false;i++;}//如果遍历结束,每个char字符都一致,则返回true;return true;}}return false;
}

·

总体步骤就是:

1,如果指定对象和当前对象的内存地址相等,则说明在内存中都是同一个对象,所以直接返回true;

2,如果指定对象和当前对象的内存地址不相等,则判断指定对象是否是String类型;

2.1,如果指定对象不是String类型,则直接返回false;

2.2,如果指定对象是String类型,则继续:

2.2.1,先将该对象强转为String类型

2.2.2,然后比较指定对象与当前对象的字符串长度,如果长度不一致,则直接返回false;

2.2.3,如果指定对象与当前对象的字符串长度一致,则遍历这两个字符串对象中的每一个char字符,

2.2.4,如果遍历过程中有一个char字符不一致,则直接返回false;

2.2.5,如果遍历结束,每个char字符都一致,则返回true;

·

char字符类型如何比较内容是否相等?

答案就是:直接用==就行了

因为Java采用Unicode编码,而且Unicode字符集中的前128个字符与Ascll字符集兼容, 所以在java中,char类型的数据是unicode编码字符

所以Java中的char型数据的运算和比较,对应着一张ASCII码表。

所以两个char类型的数据,直接用==比较即可

char类型方面,详情参见:

Java中的char类型的数据的运算和比较_Morning sunshine的博客-CSDN博客_java判断char是否相等

·

三,String的equals()方法 与 Object的equals()方法:

·

1)联系:

我们都知道,在Java中,任何一个类默认都是继承自Object类;

所以其实String也不例外,String里边的equals方法,其实是覆盖重写了Object中的equals方法。

·

2)区别:

区别也很明显:

  • String里边的equals方法是比较两个字符串对象的内容是否是相等的;
  • Object里边的equals方法是比较两个对象的内存地址是否是一致的,如果一致,即意味着这两个对象在内存中其实是一个对象,则返回true,否则返回false;

·

拓展: Object里边的equals方法:

public boolean equals(Object obj) {return (this == obj);
}

注意,当我们写代码的时候,每当要重写Object的该equals方法时,通常都需要重写hashCode方法(也是Object类中的),以保证相等的对象必须具有相等的哈希码

·

3)使用场景的区别:

除了String字符串类型比较内容是否相等之外,

其他大多数的类都是继承使用的Object的equals()方法,即比较内存地址

如果想比较类里边的内容比如说根据某个变量进行判断,那么我们需要在编写该类的时候,自己重写该Object的equals方法、以及hashCode方法。

·

举例:

比如说,在HashMap的put方法中的判断该key是否重复的时候,有一个步骤就是:

先判断这两个key的hashcode哈希码是否一致,

如果两个key的哈希码一致、并且用==或者Object的equals()方法比较发现这两个key的内存地址也一致,则判断出这是同一个key,即元素重复了。

if (p.hash == hash &&((k = p.key) == key || (key != null && key.equals(k))))e = p;

        如果两个key的哈希码一致、但是用==或者Object的equals()方法比较发现这两个key的内存地址不一致,则说明此时两个entry元素仅仅是发生了哈希冲突了,则去进行相应的处理

详情参见HashMap的put方法与get方法_Morning sunshine的博客-CSDN博客

String的equals方法原理相关推荐

  1. ==与equals,String的equals()方法

    ==介绍 它的作用是判断两个对象的地址是不是相等.即,判断两个对象是不是同一个对象(基本数据类型比较的是值,引用数据类型比较的是内存地址). 基本数据类型:byte,short,char,int,lo ...

  2. String的equals方法

    简单来说,就是 String 重写了 Object 的 equals 方法,把引用比较改成了值比较. public boolean equals(Object anObject) {//判断是否是同一 ...

  3. 判断两个学生类对象是否一致使用equals方法重写时判断条件使用“==”、“String自带的equals”不同所带来的问题

    重写equals方法判断条件使用"=="的情况 public class Test06{public static void main(String[] args){Student ...

  4. equals()方法详解

    Java语言中equals()方法的使用可以说比较的频繁,但是如果轻视equals()方法,一些意想不到的错误就会产生.哈哈,说的有点严重了~ 先谈谈equals()方法的出身.equals()方法在 ...

  5. Java中关于==和equal的区别 以及equals()方法重写

    例子i: string1="aaa"; string2="aaa"; String string3=new String("aaa"); S ...

  6. Java笔记:包装类、toString()方法、单例类、比较(==和equals方法)

    1.包装类 1)包装类为基本数据类型提供了相应的引用数据类型. (基本数据类型-包装类) btye-Byte,char-Character,short-Short,float-Float int-In ...

  7. 字符斜杠是合法常量吗_【面试秘籍】你对String的intern方法了解吗

    我们先来看个例子: public class StringTest { public static void main(String[] args) { String a = "A" ...

  8. java equ,Java equals方法详解

    首先equals方法是object类的方法,所有的类都默认继承object类,object类也就是所有类的超类. 如果两个对象进行相等比较,需要调用x.equals(y),但是如果没有重写equals ...

  9. element 方法返回的boolean被当成字符串了_quot;==quot;和 equals 方法有什么区别

    "=="和 equals 方法究竟有什么区别? 先说"==": 对于基本数据类型 (byte,short,char,int,long,float,double, ...

最新文章

  1. ORACLE 如何查询被锁定表及释放session
  2. Spring 4 + Reactor Integration Example--转
  3. SAP Spartacus shipping address页面请求1 - Address
  4. 通用数据保护条例_欧盟《通用数据保护条例》——2019年的形势
  5. 4 PP配置-组织架构-定义MRP控制者
  6. SharePoint 2007 权限代码分享
  7. [Python学习]错误篇二:切换当前工作目录时出错——FileNotFoundError: [WinError 3] 系统找不到指定的路径...
  8. python3 自动识图
  9. python优先级队列-python 优先级队列
  10. 详述 PROCEDURES_ICD 患者手术情况表 (七)
  11. Camera成像中的Demosaic
  12. Linux时间同步(NTP)
  13. Unity3D自由摄像头视角旋转,平移,缩放
  14. 微信公众号开发引导用户关注公众号
  15. 运动酒店,如何“奇袭”文旅产业精准蓝海赛道——缤跃酒店
  16. XXL-Job启动源码详解
  17. PostMan接口参数化、接口返回值传递
  18. Docker 入门(二)常用命令纯手敲带测试结果
  19. linux 挂载以及初始化硬盘
  20. SQL 查询语句 IIF()处理条件判断

热门文章

  1. 笔记本计算机半角数字切换,电脑哪个键是切换数字和中文
  2. 公众号排名被动引流 I 关键词的初始排名,认证与不认证公众号区别有多大?
  3. 中标普华linux桌面初始密码,中标普华桌面4.0快速指南
  4. 一眼看懂promise与async await的区别
  5. jquery.slimscroll.js兼容firefox和动态高度计算
  6. JavaScript 基础之对象以及构造函数
  7. Android Studio 生成 aar包 及使用
  8. 求两个字符串的LCS(最长公共子串)后缀数组
  9. Detectron2使用教程
  10. 社保数据保存现java提示_读取社保卡信息