1. 程式人生 > 實用技巧 >Java原始碼研究002:HashSet保持元素唯一性

Java原始碼研究002:HashSet保持元素唯一性

先是往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 { @HotSpotIntrinsicCandidate
public native int hashCode(); }

根據這個方法的宣告可知,該方法返回一個int型別的數值,並且是本地方法,因此在Object類中並沒有給出具體的實現。

說到本地方法>>>JAVA中有兩種方法:JAVA方法和本地方法

JAVA方法是由JAVA編寫的,編譯成位元組碼,儲存在class檔案中

本地方法是由其它語言編寫的,編譯成和處理器相關的機器程式碼

本地方法儲存在動態連結庫中,即.dll(windows系統)檔案中,格式是各個平臺專有的

JAVA方法是與平臺無關的,但是本地方法是要依賴平臺的。