解决一个问题的最好方法就是发现一个问题产生的根源,即发现最本质的东西,再去解决它。

Java语言里面的equals()方法是交给开发者们自己去覆盖重写编写功能的,即让开发者去定义当满足什么条件时,两个Object是相等的。

equals方法是由Object提供的,允许子类进行重写。

equals()的原始代码实现如下:

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

而有一些博客说equals()是比较具体的内容是不是相同的,这个说法其实不太准确,以偏概全。这个说法的来源是很多教程都是以String类中的equals()为参照物进行举例,String类的equals()重写了Object对象的原始equals方法,只会比较具体的内容。

String类的equals()的具体实现代码如下:


public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}

而 == 是比较两个引用在内存中指向的是不是同一个对象,也就是在内存中的存储地址是不是一样的,两个对象的引用相同时(指向的是同一个对象),则 == 会返回true,否则返回false。

所以 == 是和Object类的原始equals()方法是等价的。

现在很多类都对equals进行了重写,这里用常见的String类来编写个测试Demo

public class TestString {

	public static void main(String[] args) {

		String string_1 = "codevald";
String string_2 = "codevald";
System.out.println(string_1 == string_2); //结果为true String string_3 = new String("codevald");
String string_4 = "code" + new String("vald");
System.out.println(string_3 == string_4); //结果为false
System.out.println(string_3.equals(string_4)); //结果为true } }

可以看到Demo中第一个输出语句结果为true

String string_1 = "codevald"会现在栈中创建一个对String类的引用变量string_1,然后会去字符串常量池中寻找有没有"codevald",因为是第一次创建没有,则会将"codevald"存放进字符串常量池。

String string_2 = "codevald" 又在栈中创建了String类的引用变量string_2,然后会去字符串常量池中寻找有没有"codevald",如果没有,则会创建并存放进常量池,并将string_2指向"codevald",如果已经有了,则直接令string_2指向"codevald"。上面的代码已经将字符串存储进了常量池,所以两个引用(string_1和string_2)指向同一个"codevald",返回true。

String string_3 = new String("codevald")会在堆中创建一个对象,并将在栈中存在的对象引用指向堆中的对象,而String string_4则是分别用了常量池中的字符串和存放对象的堆中的字符串,做 + 的时候会进行动态调用,最后创建完生成的对象仍然存放在堆中,而两个对象在堆中的地址是不一样的,所以 == 会返回false。

而String类重写了equals方法,比较的是内存中存放的数据的具体内容是不是相同的,这里存放的都是"codevald",所以会返回true。

总结

对于字符串变量来说,使用""和"equals"比较字符串时,其比较方法不同。""比较两个变量本身的值,即两个对象在内存中的首地址,"equals"比较字符串包含内容是否相同。

对于非字符串变量来说,如果没有对equals()进行重写的话,"==" 和 "equals"方法的作用是相同的,都是用来比较对象在堆内存中的首地址,即用来比较两个引用变量是否指向同一个对象。

还傻傻分不清楚equals和==的区别吗?看完就明白了的更多相关文章

  1. 2021年了,`IEnumerator`、`IEnumerable`还傻傻分不清楚?

    IEnumerator.IEnumerable这两个接口单词相近.含义相关,傻傻分不清楚. 入行多年,一直没有系统性梳理这对李逵李鬼. 最近本人在怼着why神的<其实吧,LRU也就那么回事> ...

  2. 学编程这么久,还傻傻分不清什么是方法(method),什么是函数(function)?

    在编程语言中有两个很基础的概念,即方法(method)和函数(function).如果达到了编程初级/入门级水平,那么你肯定在心中已有了初步的答案. 也许在你心中已有答案了 除去入参.返回值.匿名函数 ...

  3. JS魔法堂:属性、特性,傻傻分不清楚

    一.前言 或许你和我一样都曾经被下面的代码所困扰 var el = document.getElementById('dummy'); el.hello = "test"; con ...

  4. Java:接口和抽象类,傻傻分不清楚?

    01. 来看网络上对接口的一番解释: 接口(英文:Interface),在 Java 编程语言中是一个抽象类型,是抽象方法的集合.一个类通过继承接口的方式,从而来继承接口的抽象方法. 兄弟们,你们怎么 ...

  5. [转帖]十分钟快速理解DPI和PPI,不再傻傻分不清!

    十分钟快速理解DPI和PPI,不再傻傻分不清! https://baijiahao.baidu.com/s?id=1605834796518990333&wfr=spider&for= ...

  6. 【华为敏捷/DevOps实践】7. 敏捷,DevOps,傻傻不分清楚【华为云技术分享】

    文:姚冬(华为云DevCloud首席技术布道师,资深DevOps与精益/敏捷专家,金融解决方案技术Leader,中国DevOpsDays社区核心组织者) 前言 敏捷是什么?DevOps是什么?两者有什 ...

  7. 傻傻分不清之 Cookie、Session、Token、JWT

    傻傻分不清之 Cookie.Session.Token.JWT 什么是认证(Authentication) 通俗地讲就是验证当前用户的身份,证明“你是你自己”(比如:你每天上下班打卡,都需要通过指纹打 ...

  8. Shell中傻傻分不清楚的TOP3

    Shell中傻傻分不清楚的TOP3 发布文章 近来小姐姐又犯憨憨错误,问组内小伙伴export命令不会持久化环境变量吗?反正我是问出口了..然后小伙伴就甩给了我一个<The Linux Comm ...

  9. URI与URL傻傻分不清楚?

    前言 总所周知,缓存是解决Http1.1协议传输性能的问题中最主要的手段. 缓存既可以存在于浏览器上,也可以存在于服务器中. 而影响缓存的Http头部有很多,其中Cache-Control是比较重要的 ...

随机推荐

  1. Django Signals

    信号 Django中提供了"信号调度",用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. Django内置的信号 Model si ...

  2. vue原生文件上传,可以多文件上传

    1.单文件上传 <template> <div> <label for="fileInput"> <i aria-hidden=" ...

  3. Arduino 上手实战呼吸灯

    前言 这篇稿子比以往的时候来的稍晚了一些,望fans们见谅,那即便如此,最终还是姗姗来迟了,公司新一轮战略性部署,被拖出去孵化新产品,开拓新市场去了,手头精力没有那么多了,另外产品一茬接一茬.韭菜一波 ...

  4. MySQL调优性能监控之show profile

    用show profile查询工具指定具体的type show profile在mysql5.7之后过时 show profile命令用于跟踪执行过的sql语句的资源消耗信息,可以帮助查看sql语句的 ...

  5. cc 攻击

    糟糕,系统又被攻击了 原创 二马读书 二马读书 10月16日 几年前,我们的电商平台遭遇过一次CC攻击(一种分布式网络攻击,后面有详细介绍

  6. get_or_create update_or_create

    django/query.py at master · django/django https://github.com/django/django/blob/master/django/db/mod ...

  7. 分别简述computed和watch的使用场景

    computed: 当一个属性受多个属性影响的时候就需要用到computed 最典型的栗子: 购物车商品结算的时候watch: 当一条数据影响多条数据的时候就需要用watch 栗子:搜索数据

  8. C段错误等调试

    本文参考 http://stackoverflow.com/questions/2179403/how-do-you-read-a-segfault-kernel-log-message和http:/ ...

  9. UI自动化测试实战

    前言 前面我们已经搭建好了wordpress网站,如果需要查看运行效果可以看我前面的搭建文章,下面我们来进行自动化测试的练习. 示例 首先我们测试自动登陆 import unittest from s ...

  10. Apache Hudi 0.7.0版本重磅发布

    重点特性 1. Clustering 0.7.0版本中支持了对Hudi表数据进行Clustering(对数据按照数据特征进行聚簇,以便优化文件大小和数据布局),Clustering提供了更灵活地方式增 ...