当前位置: 代码迷 >> Java相关 >> equals 和 == 的区别
  详细解决方案

equals 和 == 的区别

热度:717   发布时间:2006-12-05 16:20:45.0
equals 和 == 的区别

/*
* @(#) EqualSign2.java
*/


public class EqualSign2 {

public static void main(String[] args) {
Object obj1 = new Object();
Object obj2 = new Object();
System.out.println("obj1 " + (obj1 == obj2 ? "==" : "!=") + " obj2");
System.out.println("obj1 " + (obj1.equals(obj2) ? "" : "not ") + "equals to obj2");

System.out.println();

String str1 = "abc";
String str2 = "abc";
System.out.println("str1 " + (str1 == str2 ? "==" : "!=") + " str2");
System.out.println("str1 " + (str1.equals(str2) ? "" : "not ") + "equals to str2");

System.out.println();

String strObj3 = new String("def");
String strObj4 = new String("def");
System.out.println("strObj3 " + (strObj3 == strObj4 ? "==" : "!=") + " strObj4");
System.out.println("strObj3 " + (strObj3.equals(strObj4) ? "" : "not ") + "equals to strObj4");

System.out.println();

System.exit(0);
}
}


[RUN]
obj1 != obj2
obj1 not equals to obj2

str1 == str2
str1 equals to str2

strObj3 != strObj4
strObj3 equals to strObj4

Press any key to continue . . .

问题:obj1,obj2 str1,str2 strObj3,strObj4 是否 == 、equals 都是根据什么判别的?

搜索更多相关的解决方案: equals  

----------------解决方案--------------------------------------------------------
首先
obj1 != obj2
这是因为JAVA在进行对象的比较的时候是对其引用所引的内存地址进行比较,很明显obj1和obj2两个引用分别指向不同的内存地址,所以他们不相等

同样的道理我们看strObj3和strObj4,他们也因为上述的原因导致了不相等的结果。

最关键的一点是字符串常量,需要声明的一点是,Java中为了更高效率的存取字符串,通常是在内存中开辟一个字符串常量池,把内容一样的字符串放在同一个内存单元中,这样可以极大的减少Java的内存开销。基于这样做的理由就是:Java规定:字符串不可变。

回头来看看str1和str2为什么相等,很明显,str1和str2同时指向字符串常量"abc",而字符串常量"abc"在内存的字符串常量池中只有一个内存地址,所以JVM一比较这两个引用所指向的地址都是同一个内存单元("abc"所在的常量池的地址),所以就判定str1和str2相等。


----------------解决方案--------------------------------------------------------
简而言之

== 是用来直接比较地址的(地址具有唯一值)
equals 是直接比较地址所指的值

String str1 = "abc";
String str2 = "abc";
因为没有申明引用( 如通过 new 来引用其它对象 ),即都是共用的String常量池内的地址, 即地址相同



----------------解决方案--------------------------------------------------------
== : 用来比较引用所指内存地址。
equals:equals看起来是用来比较对象的值是否相等,所以有strObj3.equals(strObj4)。但是obj1.equals(obj2)的值为假,他们的值是指什么?
----------------解决方案--------------------------------------------------------
equals方法如果不被子类重写, 那么它就等价于
public boolean equals( Object o ){
return this == o;
}

----------------解决方案--------------------------------------------------------

一个新问题,equals是以什么作为判断标准的?


----------------解决方案--------------------------------------------------------
那么就是说,equals的判别标准在于语义上的规定。
----------------解决方案--------------------------------------------------------
恩~~同样的东西还有hashCode,你在处理集合类的时候就会碰到
----------------解决方案--------------------------------------------------------
  相关解决方案