1 概述
== 比較的是 所指向的對象的地址
equals 比較的是 所指向的對象的內容
注:
equals方法不能作用於基本數據類型的變量
用 == 比較基本數據類型的變量,比較的是它們的值
equals是基類 Object 中的方法,它也是用 == 來實現的,所以使用中的其他類,基本上都對 equals進行了重寫,讓其比較的是內容
總結:
因爲比較引用所指向的對象的地址不常用(一般意義不大),在開發中
如果 比較基本類型變量的值是否相同,用 ==,其他用 equals
1.1 ==
基本上分爲三種類型
1) 基本類型 == 基本類型
比較的是數值
2) 引用類型 == 引用類型
比較的是 引用變量所指向的地址
3) 基本類型 == 引用類型
即 基本類型變量和它的封裝類型變量比較,封裝類型會自動拆箱爲基本類型後再進行比較,比較的是它們的數值
實例代碼:
public class EqualDemo {
public static void main(String[] args) {
int x = 10;
int y = 10;
Integer i = new Integer(10);
Integer j = new Integer(10);
String s1 = "abc";
String s2 = "abc";
s2 = "efg";
String s3 = new String("abc");
String s4 = new String("abc");
// true 基本類型的變量的比較只能用 == , 比較的是值 它們不能 new
System.out.println(x==y);
// false 比較的是 i j 首地址的值,當然不一樣
System.out.println(i==j);
// true 會對 j 進行拆箱操作,還原爲 int, 這就是值的比較了
System.out.println(x==j);
// true s1 s2 都是存儲在常量池中,如果 s1的值常量池中沒有,就創建一個 "abc",如果有,s1就直接指向它,s2直接指向 s1 的 地址
System.out.println(s1==s2);
// false 首地址
System.out.println(s3==s4);
System.out.println(s1==s3); // false
System.out.println(s1); // abc
System.out.println(s2); // efg
}
}
1.2 equals
equals方法是基類 Object中的方法,其實現
public boolean equals(Object obj){
return (this == obj);
}
可以看到,源碼中的 equals比較方法也是用 == 實現的,比較的是地址,如果指向的是同一個對象,爲 true, 否則爲 false
Java中大部分類都重寫了 equals方法,直接拿來用,比較的就是內容,但是
自己自定義的類,如果沒有重寫 equals方法,比較的是地址,想要比較的是內容,需要自己重寫equals方法或者繼承的直接父類不是Object
Java String類的 默認 equals方法
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
自定類 實現 equals比較內容的方法
1 不重寫 equals方法
public class Person {
private String name;
private Integer age;
public Person(String name,Integer age){
this.age = age;
this.name = name;
}
public static void main(String[] args) {
Person p1 = new Person("test",24);
Person p2 = new Person("test",24);
System.out.println(p1.equals(p2)); // false
}
}
2 重寫 equals方法
public class Person1 {
private String name;
private Integer age;
public Person1(String name,Integer age){
this.age = age;
this.name = name;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public Integer getAge(){
return age;
}
public void setAge(Integer age){
this.age = age;
}
public boolean equals(Object o){
if(this == o) return true;
if(o == null || getClass() != o.getClass() ) return false;
Person1 person1 = (Person1) o;
if(name !=null ? !name.equals(person1.name):person1.name != null) return false;
return age != null ? age.equals(person1.age) : person1.age == null;
}
public static void main(String[] args) {
Person1 p1 = new Person1("li",18);
Person1 p2 = new Person1("li",18);
System.out.println(p1.equals(p2)); // true
}
}