Java中 == 和equals区别
== :等于 比较地址
1. 如果进行比较的两个操作数都是数值类型,即使他们的数据类型不同,只要他们的值相等,也会返回true。如97=='a' 返回true
2. 如果两个操作数都是引用类型,那么只有两个引用变量引用相同类的实例时才可以比较,而且这两个引用必须指向同一个对象才会返回true。
Eg:
public class Test { public static void main(String[] args) { System.out.println('a'==97); System.out.println(5==5.0); String str1=new String("hello"); String str2=new String("hello"); System.out.println(str1==str2); str1=str2; System.out.println(str1==str2); } }
运行结果:
因为指向不同对象会出现false不相等情况
把str2指向的对象赋值给str1,现在指向统一对象,所以为true
equals():
默认比较内存地址(一般会重写equals()方法),比较值
当参数obj引用的对象与当前对象为同一个对象时,就返回true,否则返回false.
String类型中,equals()比较的是两字符串内容是否相同
对象,比较的是对象地址
Eg: String类型中,equals()比较的是两字符串内容是否相同
public static void Demo2(){ String str1=new String("hello"); String str2=new String("hello"); String str3=new String("world"); String s1="hello"; String s2="hello"; System.out.println(str1.equals(str2)); System.out.println(str1.equals(str3)); System.out.println(s1.equals(str2)); System.out.println(str1==str2); System.out.println(str1==str3); System.out.println(s1.equals(s2)); }
超类Object中equals方法:
public boolean equals(Object obj) { return (this == obj); }
运行结果:
Eg2: 比较的是对象地址
public static void main(String[] args) { A a=new A(); a.a=6; A b=new A(); b.a=6; System.out.println("a的地址值"+System.identityHashCode(a)); System.out.println("b的地址值"+System.identityHashCode(b)); System.out.println(a.equals(b)); a=b; System.out.println("a的地址值"+System.identityHashCode(a)); System.out.println("b的地址值"+System.identityHashCode(b)); System.out.println(a.equals(b)); }
运行结果: