==與equals()方法
基礎數據類型
引用數據類型
1、==運算符
(1)基本數據類型比較值:只要兩個變量的值相等,即爲true
注意:當基本數據類型使用“==”進行比較時,符號兩邊的數據必須類型兼容(類型相同或可自動類型轉換),否則編譯出錯;
public class TestDemo {
public static void main(String[] args) {
double d = 2.0;
int i = 2;
int j = 2;
String str = "2";
System.out.println(i == j);//true
System.out.println(i == d);//true
//編譯出錯 編譯都過不了
// System.out.println(str == i);//Operator '==' cannot be applied to 'java.lang.String', 'int'
// System.out.println(str == d);//Operator '==' cannot be applied to 'java.lang.String', 'double'
}
}
(2)引用類型比較引用:比較兩個對象的地址值,兩個引用變量指向同一個對象的堆空間時,才爲true
Person p1=new Person();
Person p2=new Person();
if(p1==p2) //false
p1=p2;//如果有這樣的賦值語句後 if(p1==p2) //true
public class Person {
private String name;
private int age;
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person();
System.out.println(p1 == p2);//false
p1 = p2;
System.out.println(p1 == p2);//true
}
}
注意:當引用類型使用“==”進行比較時,符號兩邊的數據類型必須兼容(類型相同或有父子類關係),否則編譯出錯;
Person p=new Person();
String str=“hello”;
if(p==str)//錯誤,p和String類型不兼容,Person和String類型無父子類關係
public class Person {
private String name;
private int age;
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person();
System.out.println(p1 == p2);//false
p1 = p2;
System.out.println(p1 == p2);//true
Person p = new Person();
String str = "hello";
// System.out.println(p == str);//錯誤,p和String類型不兼容,Person和String類型無父子類關係
}
}
Student stu = new Student();//Student extends Person
if(p==stu)//編譯通過
public class Student extends Person{
public static void main(String[] args) {
Person person = new Person();
Student student = new Student();//Student extends Person
//編譯通過
System.out.println(person == student);//false
}
}
2、equals方法
格式:obj1.equals(obj2)
(1)equals():所有類都繼承了Object,也就獲得了equals()方法。
(2)自定義類可以重寫equals方法
注意:如果一個類型沒有重寫過equals方法,那麼調用equals等價於==
說明:當用equals()方法進行比較時,對類File、String、Date及包裝類(Wrapper Class)來說,是比較類型及內容;原因是在這些類中重寫了Object類的equals()方法。
重寫equals()方法的原則:
l 對稱性:如果x.equals(y)返回是“true”,那麼y.equals(x)也應該返回是“true”。
l 自反性:x.equals(x)必須返回是“true”。
l 類推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那麼z.equals(x)也應該返回是“true”。
l 一致性:如果x.equals(y)返回是“true”,只要x和y內容一直不變,不管你重複x.equals(y)多少次,返回都是“true”。
l 任何情況下,x.equals(null),永遠返回是“false”;x.equals(和x不同類型的對象)永遠返回是“false”。
public class Student extends Person{
public static void main(String[] args) {
Person person = new Person();
Student student = new Student();//Student extends Person
//編譯通過
System.out.println(person == student);//false
System.out.println(person.equals(student));//false
System.out.println("-----------");
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");
System.out.println(str1 == str2);//true
System.out.println(str1 == str3);//false
System.out.println(str1.equals(str2));//true
System.out.println(str1.equals(str3));//true
System.out.println("------------");
String str4 = "java";
System.out.println(str4 == "java");//true
System.out.println(str4.equals("java"));//true
System.out.println("java".equals(str4));//true
System.out.println(str4.equals(str4));//true
System.out.println(str4.equals(null));//false
System.out.println("j".equals('j'));//false
}
}