java中"=="和"equals"的区别

2019-12-11  本文已影响0人  bin_lifecycle

1.理解”==“的含义
在java中,主要有两个作用。

到这就注意了,你会发现,我在举引用的例子的时候,使用的是User对象,而不是String。别着急接着往下看。

2.理解"equals"的含义
先看看他的源码,equals方法是在Object中就有。注意了这里的源码是Object里面的equals

Object的equals方法

从这个源码中你会发现,比较的是当前对象的引用和obj的引用是否相同,也就是说比较的默认就是地址。还记的在上面我们使用的是User而不是String嘛?在这里==比较的是引用的地址,equals也是比较的是引用的地址,所以他们的效果在这里是一样的。

普通的对象比较

普通的对象比较无论使用 “==” 还是 “equals” 都是比较的引用指向的内存地址

3.重写equals

String重写了Object的equals方法

从上面的源码,我们能够获取到的信息是:String中的equals方法其实比较的是字符串的内容是否一样。也就是说如果像String、Date这些重写equals的类,你可要小心了。使用的时候会和Object的不一样

String字符串内存状态

现在明白了吧。

(1)String str1 = "Hello"会在堆区存放一个字符串对象

(2)String str2 = new String("Hello")会在堆区再次存放一个字符串对象

(3)String str3 = str2这时候Str3和Str2是两个不同的引用,但是指向同一个对象。

根据这张图再来看上面的比较:

(1)str1 == str2吗?意思是地址指向的是同一块地方吗?很明显不一样。

(2)str1 == str3吗?意思是地址指向的是同一块地方吗?很明显不一样。

(3)str2 == str3吗?意思是地址指向的是同一块地方吗?很明显内容一样,所以为true。

(4)str1.equals(str2)吗?意思是地址指向的内容一样吗?一样。

(5)str1.equals(str3)吗?意思是地址指向的内容一样吗?一样。

(6)str2.equals(str3)吗?意思是地址指向的内容一样吗?一样。

OK。现在不知道你能理解嘛?

4.总结

5.一个小问题
当然了,String类型到这还没结束,有一个小问题需要大家注意一下。比如看下面的代码:

image.png

在这里多了一个intern方法。他的意思是检查字符串池里是否存在,如果存在了那就直接返回为true。因此在这里首先s1会在字符串池里面有一个,然后 s2.intern一看池子里有了,就不再新建了,直接把s2指向它

上一篇下一篇

猜你喜欢

热点阅读