== :等于 比较地址
1. 如果进行比较的两个操作数都是数值类型,即使他们的数据类型不同,只要他们的值相等,也会返回true。如97=='a' 返回true
2. 如果两个操作数都是引用类型,那么只有两个引用变量引用相同类的实例时才可以比较,而且这两个引用必须指向同一个对象才会返回true。
Eg:
public classTest {public static voidmain(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 voidDemo2(){
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 booleanequals(Object obj) {return (this ==obj);
}
运行结果:
Eg2: 比较的是对象地址
public static voidmain(String[] args) {
A a=newA();
a.a=6;
A b=newA();
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));
}
运行结果: