Java原始碼研究002:HashSet保持元素唯一性
阿新 • • 發佈:2020-12-28
先是往HashSet中新增元素用到的add()方法
public class demo{ public static void main(String[] args) { HashSet<String> set = new HashSet<String>(); set.add("ada"); } }
我們找一下原始碼
package java.util; public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable {private transient HashMap<E,Object> map;
public boolean add(E e) { return map.put(e, PRESENT)==null; } }
我們可以看到,調了一個map的put()方法,而且我們也可以注意到,HashSet底層是用HashMap實現的
現在我們追蹤map.put()方法
package java.util; public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
{public V put(K key, V value) { return putVal(hash(key), key, value, false, true); } static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); } }
追蹤key.hashCode()到Object類
package java.lang;
public class Object { @HotSpotIntrinsicCandidatepublic native int hashCode(); }
根據這個方法的宣告可知,該方法返回一個int型別的數值,並且是本地方法,因此在Object類中並沒有給出具體的實現。
說到本地方法>>>JAVA中有兩種方法:JAVA方法和本地方法
JAVA方法是由JAVA編寫的,編譯成位元組碼,儲存在class檔案中
本地方法是由其它語言編寫的,編譯成和處理器相關的機器程式碼
本地方法儲存在動態連結庫中,即.dll(windows系統)檔案中,格式是各個平臺專有的
JAVA方法是與平臺無關的,但是本地方法是要依賴平臺的。