解释一下==号,他比较的是一个对象在内存中的地址值,比如2个字符串对象
String s1 = new String("str");
String s2 = new String("str");
如果用==号比较,会返回false,因为创建了两个对象,他们在内存中地址的位置是不一样的。对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。堆和栈明白吗?堆中是new的String对象,就是那两个“str”。栈中是刚才new 的两个String对象所在的地址,该地址存放于栈中。用==比较,结果比较的就是栈中两个“str”的位置是否相同,也就是比较栈中的内容,代码中就S1 ,S2 的内容。
equals的情况比较复杂,它是java.lang.Object类中的一个方法。因为java中所有的类都默认继承于Object,所以所有的类都有这个方法。在Object类源码中是这样写的。
- <p>public boolean equals(Object obj)</p><p> { </p><p>return (this == obj);</p><p> }</p>
复制代码 他同样使用==号进行内存地址的比较。但是许多java类中都重写了这个方法,比如String。
- <p>public boolean equals(Object anObject)</p><p> {</p><p> if (this == anObject)</p><p> { </p><p> return true; </p><p> } </p><p> if (anObject instanceof String)</p><p> { </p><p> String anotherString = (String)anObject;</p><p> int n = count; </p><p> if (n == anotherString.count)</p><p> { </p><p> char v1[] = value; </p><p> char v2[] = anotherString.value; </p><p> int i = offset; </p><p> int j = anotherString.offset; </p><p> while (n-- != 0)</p><p> { </p><p> if (v1[i++] != v2[j++]) </p><p> return false; </p><p> }</p><p> return true; </p><p> }</p><p> } </p><p>return false; </p><p>}</p>
复制代码 String里的方法,如果==号比较不相等,还会进行一下值的比较。这也就是说,equals()方法,不但执行了==比较,这一步比较的是栈的内容,也进行了堆内存中对象“str”的内容比较,比较的是堆内存的东西。
所以equals方法具体的作用要看当前的那个类是如何实现重写父类中该方法的。如果没有重写该方法,那么他和==号等价。
注意区分栈内存和堆内存。明白==的比较原理,估计你就明白了。
|