浅谈equals和==的区别

摘要:
让我们来看看String类的重写方法。可以看出,String的Equals()方法只比较其数据值,而不是对象的内存地址。因此,String对象的内存地址是否相同并不影响其结果。Equals()仅比较数据值。注意,“==”比“equals”运行得更快,因为“==“只是引用的比较。

这个问题在面试或者源码分析都经常出现,先不着急,让我们来了解一下Java中的数据类型。

java中的数据类型分为: 基本数据类型和引用数据类型。

基本数据类型

  • 4种整数类型:int、long、byte、short  
  • 2种浮点数类型:float、double  
  • 1种字符类型:char  
  • 1种布尔类型:boolean

引用数据类型

  • 接口
  • 数组

一、==

== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。

  • 对于基本数据类型来说,== 比较的是值是否相等

如:int a=10 与 long b=10L 与 double c=10.0都是相同的(为true),因为他们都指向地址为10的堆。

  • 对于引用数据类型来说,== 比较的是两者在内存中存放的地址(堆内存地址)
  • 两边的操作数必须是同一类型的(可以是父子类之间)才能编译通过。

浅谈equals和==的区别第1张

二、equals

1.equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。

2.equals方法最初是在所有类的基类Object中进行定义的,源码是

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

我们可以从这段源码看出,在没有重写equals方法之前,equals方法里是直接调用==,因此实质上与==没有差别。但是要注意:equals方法不能作用于基本数据类型的变量,这是因为基本数据类型非对象的缘故,没有方法。

3.由于类的多态,如果我们重写了equals()方法,那么判断结果将为我们自己定义。下面来看下String类重写的方法:

浅谈equals和==的区别第2张

 可以看出,String的equals()方法仅仅是对比它的数据值,而不是对象的内存地址,所以不管String对象的内存地址是否相同并不影响其结果,equals()比较的仅仅是数据值。

三、两者区别

  • ==

基本类型:对比它们的值是否相等

引用类型:对比它们的内存地址是否相等

  • equals()

如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;

诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

注意

另外,"=="比"equals"运行速度快,因为"=="只是比较引用。

免责声明:文章转载自《浅谈equals和==的区别》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇docker--containerlinux下将Python环境默认更改为Python3.6下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Corona SDK新手教程:tap、touch和multitouch的区别

本教程主要讲解一下tap、touch和multitouch的区别,以及如何处理每种方式。 如果是新手的话,可以先复习一下之前的文章 CoronaSDK之交互系统和事件检测 1 Tap检测 Tap事件是用户和触屏之间交互最基础的一种。本质上来说,一个tap就是表示用户用手指接触到屏幕,然后在差不多附近的位置再抬起的过程。这个tap事件只有在用户在同一个点接触...

ceph介绍

  一、Ceph简介:         Ceph是一种为优秀的性能、可靠性和可扩展性而设计的统一的、分布式文件系统。ceph 的统一体现在可以提供文件系统、块存储和对象存储,分布式体现在可以动态扩展。在国内一些公司的云环境中,通常会采用 ceph 作为openstack 的唯一后端存储来提高数据转发效率。        Ceph项目最早起源于Sage就读...

C#——DataGridView控件填写数据事件

对于DataGridView控件,与单元格内容相关的有以下这几个事件: <span style="font-size:18px;">// 当单元格内容改变并且提交之后发生(提交一般是单元格在编辑完之后失去焦点) private void dataGridView_CellValueChanged(object sender, DataGridV...

error C2220: 警告被视为错误 没有生成“object”文件

http://blog.csdn.net/cay22/article/details/5613625 这种错误的原因是:原因是该文件的代码页为英文,而我们系统中的代码页为中文。 解决方案: 1. 启动Microsoft Visual Studio 2005,文件->打开->选择该cpp,然后保存。从新打开程序文件运行,此错误不再出现。     ...

Java 使用 Map 实现缓存工具

以下代码参考于网上,做了小部分修改。 该代码实现了定时清除临时缓存的功能。 缓存管理类 1 package com.wbproject.util.cache; 2 3 import java.time.LocalDateTime; 4 import java.time.format.DateTimeFormatter; 5 impor...

vue报类似警告Computed property "isLoading" was assigned to but it has no setter

一、原因:一个计算属性,当计算传入的是一个函数,或者传入的是一个对象,而没有设置 setter,也就是 set 属性,当你尝试直接该改变这个这个计算属性的值,都会报这个警告,vuex还会出现通过commit提交修改vuex值的警告的情况。 参考文档: 二、常见导致该错误的写法 (1)计算属性中传入的是对象和方法,直接对计算属性进行赋值会导致错误 比如:...