equals和==经常用来去比较两个值或者两个对象。
==如果只是用来比较基本数据类型常量的话,那么比较的就是两个常量的值,如果用来去比较两个对象引用,那么比较的是两个对象的地址。equals在java中一般都是比较两个对象的值,前提是java提供的类中重写了equals这一方法(绝大多数equals方法在java类中均被重写)。
当str1和str2都是引用类型
public static void main(String[] args) { String str1 = new String("aaa"); String str2 = new String("aaa"); System.out.println(str1.equals(str2)); System.out.println(str1 == str2); }
如上面代码,当new两个String类对象时,new String("aaa")分别在常量池创建了"aaa"对象,然后在堆内存new了对象str,对象成员变量赋予aaa的值。
因而new两次对象后,堆内存中的str1和str2分别是两个不同的对象,地址不相同,值相同,最后equals比较返回值相等为true。当用==去比较时,因为两个对象地址不同因而输出为false。
当str1和str2都是常量时的情况
public static void main(String[] args) { String str1 = "aaa"; String str2 = "aaa"; System.out.println(str1.equals(str2)); System.out.println(str1 == str2); }
如果在自己写的类中equals方法没有被重写的话,默认还是比较地址,相当于==。
class Animal{ private String type; public Animal(String type) { this.type = type; } } public class test35 { public static void main(String[] args) { Animal animal1=new Animal("cat"); Animal animal2=new Animal("dog"); System.out.println(animal1.equals(animal2)); } }
如上面代码,自己构造的类中如果没有去重写equals方法则默认还是比较地址,因而返回false。
特殊情况
public static void main(String[] args) { int i=0; Integer j=new Integer(0); Integer k=new Integer(0); System.out.println(i==j); System.out.println(j.equals(i)); System.out.println(j==k); System.out.println(j.equals(k)); }
当 i 是一个基本数据类型,j 作为一个包装引用类型时,i 和 j 使用 == 进行比较时,j会进行自动拆箱,变成一个基本类型:0,因而==比较返回结果为true。
j 和 k 都是包装引用类型时,没有拆箱操作,== 比较的仍然是j和k的地址。