== 和 equal 区别

其实写这个的目的不仅仅只是回答他们的区别。还有一些引申问题想顺便一起总结下。

 

测试String  (引用自:https://baijiahao.baidu.com/s?id=1652442464525126879&wfr=spider&for=pc,个人感觉这个同学写的很清晰)

看看下面的代码:

 

 

在上面的代码中,定义了三个字符串,分别使用==和equals去比较。为什么会出现这样一个结果呢?还需要从内存的角度来解释一下。

3、内存解释

在java中我们一般把对象存放在堆区,把对象的引用放在栈区。因此在上面三个字符串的内存状态应该是下面这样的。

 

 

 

现在明白了吧。

(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)嘛?意思是地址指向的内容一样嘛?一样。

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

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

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

 

string  源码:

 

 

 

 

基础类型比较:使用==比较值是否相等。

引用类型比较:①重写了equals方法,比如String。

        第一种情况:使用==比较的是String的引用是否指向了同一块内存

        第二种情况:使用equals比较的是String的引用的对象内用是否相等。

      ②没有重写equals方法,比如User等自定义类

        ==和equals比较的都是引用是否指向了同一块内存。

 

String 为什么要重写hashCode()?

主要是Object.hashCode的通用约定:

a.  在java应用程序运行时,无论何时多次调用同一个对象时的hsahCode()方法,这个对象的hashCode()方法的返回值必须是相同的一个int值.

b.  如果两个对象equals()返回值为true,则他们的hashCode()也必须返回相同的int值.

c.  如果两个对象equals()返回值为false,则他们的hashCode()返回值也必须不同.

        String s1 = new String("1111");
        String s2 = new String("1111");
        s1.hashCode();
        s2.hashCode();
        System.out.println(s1.equals(s2));

s1和s2对象所指的内存地址是不一样的,一个对象的hashcode是内存地址进行hash运算而得,如果string没有重写hashcode,那么s1和s2的hashcode 也有可能是不一样的。如果用Obejct的equals方法,那么比较的手机两个对象在堆内存的地址,那么结果会是是false,但是在业务系统中我们需要的是对象属性是否一致,所以重写了equals方法。string的底层数据结构是char数组,所以重写equals的逻辑就是两个对象的char数组循环比较值。那么equals重写了,但是如果hashcode没有重写那就违反了Object.hashCode的通用约定,所以hashCode必须也重写。可以从源码看出,两个值相等的String 的hashCode一定相等。

posted @   雪域飞魂  阅读(116)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示