==是用来比较内存地址的,而equals是用来比较值的。但也有一些例外需要注意一下:在Object类中其中的equals方法的源代码也是用==来判断的,即是根据内存地址。
1,如果是比较基本数据类型(int,long,char,boolean,double,float,short,byte)用==是比较内存地址,因为基本数据类型用的是享元模式,且没有equals方法。
2,如果是比较基本数据类型对象(Integer,Long,Character,Boolean,Double,Float,Short,Byte)用==比较的是内存地址,用equals比较的是值,因为基本数据类型对象重写了Object中的equals()方法,此时的equals()是根据值而不是根据内存地址。
3,String类比较:如下
String str1 = "123";
String str2 = "123";
String str3 = new String("123");
System.out.println(str1==str2);
System.out.println(str1.equals(str2));
System.out.println(str1==str3);
System.out.println(str1.equals(str3));
输出结果是:
true
true
false
true
上例中两个“123”的内存地址是一样的,而new String("123");地址跟前两个是不一样的,但值是一样的。
可以看出==是根据内存地址比较的,而equals()是根据值比较的,因为String类已经重写了Object中的equals方法。
4,自己写的类进行比较:
如果想通过值比较自己写的类,那么这个类必须重写equals()方法,不然的话,在比较的时候,该类会调用Object类的中equals方法,而Object 中equals方法是按内存地址比较的。 |