Java ==,equals ,hashCode 的比較


Java ==,equals ,hashCode 的比較


1.Java中的數據類型

基本數據類型: byte,short,char,int,long,float,double,boolean 他們之間的比較,應用雙等號(==),比較的是他們的值即(他們在內存中存放的地址)。

<code>public static void main(String[] args) {
System.out.println("對象的比較@@@@@@@@@@@@@@@@@@@@@@@");
String str=new String("asda");
System.out.println(str==str); //true
}/<code>

如果是同一個new出來的對象,通過比較,結果是true, 對象存放在堆中,棧中存放的是對象的引(地址),由此可見是對棧中的值進行比較的,如果想比較堆中對象的內容是否相等,就需要重寫equals的方法。

引用類型: 即包裝類(String ,Date ,Interge,數組等)

代碼說明:

<code>public static void main(String[] args) {
int a =1;
int b =1;
Integer integer1=new Integer(1);
Integer integer2=new Integer(1);

String str="aa";
String str1=new String("aa");

String str2=new String("aa");
System.out.println(a==b); //true
System.out.println(integer1==b); //true,自動拆箱int
System.out.println(str1==str2); //false ,在棧中存放的地址不同
System.out.println(str==str1); //false

}/<code>

2、equals的概述

默認情況:(沒有覆蓋equals方法)下equals方法都是調用Object類的equals方法,而Object的equals方法主要用於判斷對象的內存地址引用是不是同一個地址(是不是同一個對象)。

下面是Object類中equals方法:

<code> public boolean equals(Object obj) {
return (this == obj);
}/<code>

2 、要是類中覆蓋了equals方法,那麼就要根據具體的代碼來確定equals方法的作用了,覆蓋後一般都是通過對象的內容是否相等來判斷對象是否相等。下面是String類對equals進行了重寫:

<code>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;
} /<code>

3、hashCode

hashCode()方法返回的就是一個數值,從方法的名稱上就可以看出,其目的是生成一個hash碼。hash碼的主要用途就是在對對象進行散列的時候作為key輸入,據此很容易推斷出,我們需要每個對象的hash碼儘可能不同,這樣才能保證散列的存取性能。事實上,Object類提供的默認實現確實保證每個對象的hash碼不同(在對象的內存地址基礎上經過特定算法返回一個hash碼)。Java採用了哈希表的原理。

hashCode的作用

主要應用在Java 的號集合當中  

總的來說,Java中的集合(Collection)有兩類,一類是List,再有一類是Set。前者集合內的元素是有序的,元素可以重複;後者元素無序,但元素不可重複。

那麼這裡就有一個比較嚴重的問題了:要想保證元素不重複,可兩個元素是否重複應該依據什麼來判斷呢?

這就是Object.equals方法了。但是,如果每增加一個元素就檢查一次,那麼當元素很多時,後添加到集合中的元素比較的次數就非常多了。也就是說,如果集合中現在已經有1000個元素,那麼第1001個元素加入集合時,它就要調用1000次equals方法。這顯然會大大降低效率。

於是,Java採用了哈希表的原理。

這樣一來,當集合要添加新的元素時,

先調用這個元素的hashCode方法,就一下子能定位到它應該放置的物理位置上。

如果這個位置上沒有元素,它就可以直接存儲在這個位置上,不用再進行任何比較了;

如果這個位置上已經有元素了,就調用它的equals方法與新元素進行比較,相同的話就不存,不相同就散列其它的地址。所以這裡存在一個衝突解決的問題。這樣一來實際調用equals方法的次數就大大降低了,幾乎只需要一兩次。

每天進步一丟丟

完成。


分享到:


相關文章: