Java中equals和==区别
结果是
现在就来探索一下,为什么str1和str3会不等
学妹:学长,为什么结果会是这样啊?
我:学妹莫怕,躲进我怀里,快来。看学长大威天龙收了这代码!
学妹:那我就看学长表演了,嘻嘻~
我:学妹先让我给你复习下基本知识,让我把我的数年功力都传送给你。
学妹:好的,来吧,学长。
先说一个String的小知识,String对象(不使用new运算符生成)存储于java的MetaSpace(元数据区) 的常量池中,我们先看下不使用new运算符创建String对象的过程,比如创建对象为:String string = “我的对象”; ,创建过程为:先检查java的常量池中是否存在我的对象这个数据,如果有那么就把这个数据的地址给string。如果没有,就先存储我的对象,再把地址给string。
而使用new运算符生成的对象存储于 JavaHeap( java堆),jvm上面是这么描述的:所有的对象和数组都会在堆内存分配空间。所以通过new运算符创建的String对象和不通过new运算符创建的String对象根本就不存储在同一个地方,而对象存放的是一个地址,所以这两者地址上是不等的,而 == 就 是对地址的判断和比较。
学妹:那为什么equals为什么又相等了呢?
我:当当当~就是这个
equals
我们都知道Object类是所有类的爸爸
Object: 叫爸爸!
而Object类中的equals方法是:
学妹:那不就是 == 去判断了吗?为什么str1.equals(str3)会相等了呢?
我:学妹,你不要急,且听我娓娓道来。话说五百年前,有一个类名叫String,他勇猛异常,在代码里三进三出,万码之中,斗气化码…
学妹:说人话。。
我:其实String类重写了他老爸(Object)的equals方法,就是下面这样
学妹:我知道了,他是先进行地址比较,然后再使用字符去一个一个比较,如果不相等就返回false吗?
我:没错,学妹真聪明。重写了equals的类还有File、Date等等。既然问题解决了,那待会一起吃个饭吗?
学妹:不了,我还要回去洗澡呢,下次吧,下次再约~
我:小丑竟是我自己!