对==与equals比较的学习

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_37762923/article/details/72875694

初学时,我是记住只要有new关键字就都用equals来比较两者,其他用==来比较,这样的记法是片面的甚至是错误的。随着使用的多,我就发现了数组也是有new关键字,但是我在判断其中的两个内容是否相等的时候就是用了==,而不是用equals.


int a[] = new int[3];

a[0]=2;

a[1]=5;

a[2]=2;

System.out.println(a[0]==a[2]);

返回结果是true



所以我之前的是存在错误的。

现在又是进行第二次的理解


①创建str1时回去查找是否已经有这样内容的一个地址空间,如果有了则不再创建新的空间了,如果没有则创建。

②所以创建的str2其实是指向与str1统一的空间,因为其内容相同就不再去新创建空间了。

③所以str1str2之间的比较==equals的结果都是true因为其不仅指向的空间一样且值是一样的。我理解是一个空间,里面存放着hello这个值,然后str1str2的指针都指向了它,所以两种判断都一样结果。

str3str4都各自用了new去新建了各自的空间,里面存的值虽然是一样的,但其内存地址不相同。

注:一:对于==,如果作用于基本数据类型的变量,则比较其存储的“值”是否相等

如果作用于引用类型的变量,则比较的是所指的地址。(其str1str2解析并不矛盾,他们的地址的确一致的)

二:对于equals方法,它不能作用于基本数据类型的变量,它比较的是地址。

 

⑤所以str3str4==来比较是相当于比较地址,他们的各自地址不一样,所以比较结果是false。而String类对equals方法进行了重写,用来比较指向的字符串对象所存储的字符串是否相等。



⑥所以str3str4经过equals比较结果为true

⑦如果str3str4同时指向了str则原来的连接断开指向str的内存地址,则两个无论是==比较还是经过equals比较都为true

这些是再次学习的理解,发现了错误希望能指出,以便我作改正。


猜你喜欢

转载自blog.csdn.net/weixin_37762923/article/details/72875694