1咽笼、==
==為兩個對象地址的判斷
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");
System.out.println(str1 == str2);
System.out.println(str2 == str3);
str1 == str2 為true萤衰,他們都是存放在常量池中的數(shù)據(jù)像捶,指向同一地址,所有相同
str2 == str3 為false, str3指向new的對象地址扬跋,而str2位常量池中的地址阶捆,所以不同
2、equals
在Object中的默認實現(xiàn)就是==钦听,比較對象的地址洒试,子類可以重寫equals方法,實現(xiàn)對象的比較
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");
System.out.println(str1.equals(str2));
System.out.println(str2.equals(str3));
兩個輸出的結(jié)果都為true朴上,因為String類中重寫Object中的equals方法垒棋,增加了內(nèi)容的判斷
3、hashcode()
hashCode返回的是一個int的數(shù)值痪宰,其目的是實現(xiàn)一個hash碼叼架,hashCode方法的主要作用是為了配合基于散列的集合一起正常運行,(HashSet衣撬、HashMap以及HashTable)乖订,在基于散列的集合為了阻止數(shù)據(jù)的重復(fù)判斷集合是否已存在相關(guān)對象,一般沒有作用,在散列表中才有作用
== 和equals的對比
equals在Object中默認實現(xiàn)就是==具练,默認是通過對象的地址來判斷對象是否相等垢粮,對象一般會通過對equals的重寫來進行對象的判斷
class Person{
private int age;
public Person(int age){
this.age = age;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
}
public static void main(String[] args){
Person p1 = new Person(16);
Person p2 = new Person(16);
System.out.println(p1 == p2);
System.out.println(p1.equals(p2))
}
p1 == p1 返回false,判斷的是對象的地址靠粪,因為新建的是兩個對象蜡吧。
p1.equals(p2) 返回true,因為重寫了person中的equals方法占键,判斷的是里面的內(nèi)容
hashCode和equals的聯(lián)系
在一般的集合和操作中昔善,如果不是進行散列表的數(shù)據(jù)結(jié)構(gòu)操作,他們是沒有關(guān)系的
在普通對象的比較中畔乙,通過equals方法判斷返回true的時候君仆,他的hashcode不一定相等
在進行散列表的數(shù)據(jù)結(jié)構(gòu)操作是,有如下關(guān)系:
1牲距、如果對象中重寫了equals方法返咱,則有必要重寫hashCode方法
2、如果equals返回true牍鞠,則hashcode有必要也返回相等的hash值
3咖摹、如果equals返回false,則hashcode不一定返回不同的hash值难述,但為不相等的對象生成不同的hash值萤晴,可以提高哈希表的性能
3、如果hashCode值返回true胁后,則equals不一定要返回true
4店读、如果hashcode值返回false,則equals一定返回false
7攀芯、同一對象在執(zhí)行期間若已經(jīng)存儲在集合中屯断,則不能修改影響hashCode值的相關(guān)信息,否則會導(dǎo)致內(nèi)存泄露問題