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类型这种,属于引用类型,变量中存储的是地址,对应的地址存储数据

image-20210730111213737

二、先说下"==":

对于基本数据类型,==是直接比较字面值

对于引用数据类型,==是比较的是,是否指向同一块内存空间。但是我们又常常碰到这样一个问题:

image-20210805114038680

最终结果是 true,true,false,false那既然==是比较的地址,那么int数据的地址是怎样的呢,String又是怎样的呢?

对于基本数据类型来说,他们是作为常量在方法区中的常量池里面以HashSet策略存储起来的,对于这样的字符串 “123” 也是相同的道理,在常量池中,一个常量只会开辟一个空间,对应一个地址,因此不管是再多的 123,“123” 这样的数据都只会存储一个地址,所以所有他们的引用都是指向的同一块地址。

另外,对于基本数据的包装类型(Byte, Short, Character,Integer,Float, Double,Long, Boolean)除了Float和Double之外,其他的六种也在常量池开辟自己的缓存区,因此对于这些数据类型而言,一般我们也可以直接通过==来判断是否相等。那么问题来了:

image-20210805143554217

猜一下,结果是啥?











结果是true,false。没想到吧,这是为啥呢?其实是因为 Integer 包装类为了提高一些性能和内存利用,有一个类似缓存的概念,在常量池中的存储范围为**[-128,127]**,127在这范围内,是直接存储于常量池这个缓存区的,而128不在这范围内,所以会在堆内存中创建一个新的对象来保存这个值,所以m,n分别指向了两个不同的对象地址,故而导致了不相等。

三、再来看下equals()

先看一下Object类中equals()的源码:

Object的源码:

在这里插入图片描述

发现equals()方法的本质还是实现==进行比较,就本质上来说,区别并不大

那么问题来了,如果本质上的区别并不是很大,为什么还单独存在一个equals()方法呢?

因为Obejct类是所有类的老祖宗类,其他的类就都可以重写这个equals()方法,拥有自己的equals()方法

这里看下两个引用数据类型的源码

String的源码:

在这里插入图片描述

Integer源码:

image-20210809111416589

因为每个引用数据类型重写的都不一样,就不一一分析了,String和Integer这两个常用的我们来简单的说下

分析String源码的equals()方法,我们知道它就是比较字符串的内容是否一样,不是内存的比较

举个例子:

在这里插入图片描述

==上面说过了就不多说了,说一下equals(),比较的是内存空间中的内容是否相等,所以这两个都是true,大家明白了嘛?

总结

  • 基本数据类型比较
    • 使用==比较的值是否相等。
  • 引用类型的比较
    • 如果没有重写equals方法,和==基本上没有区别
    • 如果重写了equals方法,比如String
      • 使用==比较的是String的引用是否指向了同一块内存
      • 使用equals比较的是String的引用的对象内容是否相等

大家明白了吗?本人比较菜,哪里有啥问题大家可以评论出来,一起讨论一起学习,这篇先说到这,Integer这篇没有说,后期还会进行更新和修改~



这篇关于java中==和equals()的区别的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程