java中==和equals()的区别
2021/8/9 12:36:07
本文主要是介绍java中==和equals()的区别,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
java中==和equals()的区别
本人是个菜鸟小白,每天都在一点点学习,最近遇到这种问题,今天来讨论一下…
一、先来说说Java的基本数据类型和引用类型
Java中有八大基本数据类型:byte,short,int,long,double,folat,boolean,char
其中占1个字节的是byte,short和char占两个字节,int,float占四个字节,double和long占8个字节,boolean占1位,只有true和false,这八种数据变量中直接存储值
八大基本数据类型对应着各自的封装类型,提供了更多的方法,且不进行初始化时值默认为空(基本数据类型必须初始化)
还有就是像String类型这种,属于引用类型,变量中存储的是地址,对应的地址存储数据
二、先说下"==":
对于基本数据类型,==是直接比较字面值
对于引用数据类型,==是比较的是,是否指向同一块内存空间。但是我们又常常碰到这样一个问题:
最终结果是 true,true,false,false那既然==是比较的地址,那么int数据的地址是怎样的呢,String又是怎样的呢?
对于基本数据类型来说,他们是作为常量在方法区中的常量池里面以HashSet策略存储起来的,对于这样的字符串 “123” 也是相同的道理,在常量池中,一个常量只会开辟一个空间,对应一个地址,因此不管是再多的 123,“123” 这样的数据都只会存储一个地址,所以所有他们的引用都是指向的同一块地址。
另外,对于基本数据的包装类型(Byte, Short, Character,Integer,Float, Double,Long, Boolean)除了Float和Double之外,其他的六种也在常量池开辟自己的缓存区,因此对于这些数据类型而言,一般我们也可以直接通过==来判断是否相等。那么问题来了:
猜一下,结果是啥?
。
。
。
。
。
。
。
。
。
。
。
结果是true,false。没想到吧,这是为啥呢?其实是因为 Integer 包装类为了提高一些性能和内存利用,有一个类似缓存的概念,在常量池中的存储范围为**[-128,127]**,127在这范围内,是直接存储于常量池这个缓存区的,而128不在这范围内,所以会在堆内存中创建一个新的对象来保存这个值,所以m,n分别指向了两个不同的对象地址,故而导致了不相等。
三、再来看下equals():
先看一下Object类中equals()的源码:
Object的源码:
发现equals()方法的本质还是实现==进行比较,就本质上来说,区别并不大
那么问题来了,如果本质上的区别并不是很大,为什么还单独存在一个equals()方法呢?
因为Obejct类是所有类的老祖宗类,其他的类就都可以重写这个equals()方法,拥有自己的equals()方法
这里看下两个引用数据类型的源码
String的源码:
Integer源码:
因为每个引用数据类型重写的都不一样,就不一一分析了,String和Integer这两个常用的我们来简单的说下
分析String源码的equals()方法,我们知道它就是比较字符串的内容是否一样,不是内存的比较
举个例子:
==上面说过了就不多说了,说一下equals(),比较的是内存空间中的内容是否相等,所以这两个都是true,大家明白了嘛?
总结
- 基本数据类型比较
- 使用==比较的值是否相等。
- 引用类型的比较
- 如果没有重写equals方法,和==基本上没有区别
- 如果重写了equals方法,比如String
- 使用==比较的是String的引用是否指向了同一块内存
- 使用equals比较的是String的引用的对象内容是否相等
大家明白了吗?本人比较菜,哪里有啥问题大家可以评论出来,一起讨论一起学习,这篇先说到这,Integer这篇没有说,后期还会进行更新和修改~
这篇关于java中==和equals()的区别的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-01后台管理开发学习:新手入门指南
- 2024-11-01后台管理系统开发学习:新手入门教程
- 2024-11-01后台开发学习:从入门到实践的简单教程
- 2024-11-01后台综合解决方案学习:从入门到初级实战教程
- 2024-11-01接口模块封装学习入门教程
- 2024-11-01请求动作封装学习:新手入门教程
- 2024-11-01登录鉴权入门:新手必读指南
- 2024-11-01动态面包屑入门:轻松掌握导航设计技巧
- 2024-11-01动态权限入门:新手必读指南
- 2024-11-01动态主题处理入门:新手必读指南