java双等号和equals_JAVA编程基础篇:hashCode的特性和作用
hashCoed 的特性
(1)HashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,HashCode經常用于確定對象的存儲地址;
(2)如果兩個對象相同, equals方法一定返回true,并且這兩個對象的HashCode一定相同;
(3)兩個對象的HashCode相同,并不一定表示兩個對象就相同,即equals()不一定為true,只能夠說明這兩個對象在一個散列存儲結構中。
(4)如果對象的equals方法被重寫,那么對象的HashCode也盡量重寫。
equals()方法與 “=="號 的區別
1、超類Object的equals()底層原理:
在超類Object中有一個equals()的基本方法,源碼如下:
public boolean equals(Object obj) { return (this == obj); }
實際上我們知道所有的對象都擁有標識(內存地址)和狀態(數據),同時“==”比較的是兩個對象的內存地址,在Object的equals方法底層調用的是==號,所以說Object的equals()方法是比較兩個對象的內存地址是否相等,如果為true,則表示的引用的是同一個對象。
2、equals()與"==" 的區別:
(1)== 號在比較基本數據類型時比較的是數據的值,而用 == 號比較兩個對象時比較的是兩個對象的地址值;
(2)equals()不能用于基本的數據類型,對于基本的數據類型要用其包裝類。
(3)默認情況下,也就是從Object繼承而來的 equals 方法與 “==” 是完全等價的,比較的都是對象的內存地址,因為底層調用的是 “==” 號,但我們可以重寫equals方法,使其按照我們的需求方式進行比較,如String類重寫equala()方法,使其比較的是字符的內容,而不再是內存地址。
hashCode 的作用
Java中的集合有兩類,一類是List,再有一類是Set。前者集合內的元素是有序的,元素可以重復;后者元素無序,但元素不可重復。 equals方法可用于保證元素不重復,但如果每增加一個元素就檢查一次,若集合中現在已經有1000個元素,那么第1001個元素加入集合時,就要調用1000次equals方法。這顯然會大大降低效率。 于是,Java采用了哈希表的原理。
哈希算法也稱為散列算法,是將數據依特定算法直接指定到一個地址上。這樣一來,當集合要添加新的元素時,先調用這個元素的HashCode方法,就一下子能定位到它應該放置的物理位置上。
(1)如果這個位置上沒有元素,它就可以直接存儲在這個位置上,不用再進行任何比較了;
(2)如果這個位置上已經有元素了,就調用它的equals方法與新元素進行比較,相同的話就不存了;
(3)不相同的話,也就是發生了Hash key相同導致沖突的情況,那么就在這個Hash key的地方產生一個鏈表,將所有產生相同HashCode的對象放到這個單鏈表上去,串在一起。這樣一來實際調用equals方法的次數就大大降低了。
所以hashCode在上面扮演的角色為尋域(尋找某個對象在集合中區域位置)。hashCode可以將集合分成若干個區域,每個對象都可以計算出他們的hash碼,可以將hash碼分組,每個分組對應著某個存儲區域,根據一個對象的hash碼就可以確定該對象所存儲區域,這樣就大大減少查詢匹配元素的數量,提高了查詢效率。
總結
以上是生活随笔為你收集整理的java双等号和equals_JAVA编程基础篇:hashCode的特性和作用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 两个gcc_KDD 2020 | GCC
- 下一篇: left join 索引失效无条件_技术