在看区别之前,首先来看下以下代码:
public class TestEqual { /** * @param args * I am not responsible of this code. * They made me write it, against my will. */ public static void main(String[] args) { // TODO Auto-generated method stub String a = "111"; String b = "111"; String c = new String("111"); int a1 = 111; int b1 = 111; Integer c1 = new Integer(111); Integer c2 = new Integer(111); System.out.println(a == b); //true System.out.println(a == c); //false System.out.println(c == b); //false System.out.println(a.equals(c)); //true System.out.println("**************************"); System.out.println(a1 == b1); //true System.out.println(a1 == c1); //true System.out.println(c2 == c1); //false System.out.println(a.equals(c1)); //false System.out.println(c1.equals(c2)); //true } }
(一) "=="
首先先看定义的三个字符串对象,他们的值都是111。但a==b时,值为true 而 a==c时,为false,为什么呢?
String a = "111" 当表达式执行的时候,会首先去内存中的字符串池中去找,看有没有"111"这个字符串,如果没有的话,就在字符串池中创建一个,等String b = "111"时,则a,b其实是指向了同一片内存地址空间。而String c = new String("111")则不会去字符串池中查找,是直接创建一个"111",所以String c = new String("111")时,它会再创建一个,所以这时a,c指向的是不同的内存空间。
当==用于比较对象的引用时,实质上是比较两个引用的地址是否相等。其中java的双引号表达式本身就会创建一个字符串对象。
其次再看定义的两个int型变量以及两个Integer对象。a1==b1毫无疑问他两值相等,为true。而a1==c1也为true,这又是为什么呢?
其实自jdk1.5之后,基本类型的所对应的引用类型可以自动转换成基本类型与基本类型进行值比较.(自动拆箱)..而a1==c1实质上变成了a1== c1.intValue()
当==用于比较基本数据类型时,实质上就是比较他们的值是否相同。
(二)equal()
由a.equals(c)与c1.equals(c2)他们值为true,看出他们比较的对象是相同的。
equal()来判断两个对象是否相等。对于字符串来说,也是比较字符串的字符序列是否相等。
equals方法可以参考API中的java.lang.Object和java.lang.String。
参考: http://www.cnblogs.com/zhxhdean/archive/2011/03/25/1995431.html
http://blog.sina.com.cn/s/blog_79333b2c0100xd34.html
结果的得出与上边叙述无关系,只做解释而已