詳述HashSet類add方法(一)

2021-10-05 08:13:34 字數 1679 閱讀 2824

詳述hashset類add方法(一)

分析第一次新增資料的步驟

public class test2 

}

1.呼叫hashset add()方法,原始碼如下

public boolean add(e e)
2.返回map.put()值,key為e,value值為present常量,方法原始碼如下

public v put(k key, v value)
3.返回putval()值,方法中hash(key)方法如下

static final int hash(object key)
putval()方法原始碼:

因為table為全域性變數,此時為null,走第乙個if,使用resize()方法返回newtab,返回的n為陣列長度16

接著走第二個if,因為第一次新增值,計算的位址中為null,所以新增乙個新節點

final v putval(int hash, k key, v value, boolean onlyifabsent, boolean evict) 

if (e.hash == hash &&

((k = e.key) == key || (key != null && key.equals(k))))

break;

p = e;}}

v oldvalue = e.value;

if (!onlyifabsent || oldvalue == null)

e.value = value;

afternodeaccess(e);

return oldvalue;}}

++modcount;

if (++size > threshold)

resize();

afternodeinsertion(evict);

第乙個if中resize()方法原始碼:

inal node resize() 

else if ((newcap = oldcap << 1) < maximum_capacity && oldcap >= default_initial_capacity)

newthr = oldthr << 1; // double threshold

}else if (oldthr > 0) // initial capacity was placed in threshold

newcap = oldthr;

else

if (newthr == 0)

threshold = newthr;

@suppresswarnings()

node newtab = (node)new node[newcap];//重點2

table = newtab;

if (oldtab != null)

else

} while ((e = next) != null);

if (lotail != null)

if (hitail != null) }}

}}

return newtab;//重點3,返回的newtab與table指向同乙個物件

}

詳述HashSet類add方法(一)

我們知道,add方法可以用來向集合中新增元素,對於hashset集合來說,不允許儲存重複的元素,當我們儲存元素的時候,集合會對新增進來的元素進行判斷是否重複,首先我們對新加元素進行分析 add方法原始碼 jdk 11.0.4 public boolean add e e 此時我們發現,返回值是乙個布...

詳述HashSet類add方法(二)

此時我們來分析當新增重複元素進hashset集合時的情況 原始碼如下 add方法 public boolean add e e put方法 public v put k key,v value hash 方法 static final inthash object key putval 方法 fin...

詳述HashSet類add方法(三)

詳述hashset類add方法 三 public class test1 學生類 public class student 1.當第二次新增學生物件時,首先呼叫add 方法 public boolean add e e 2.呼叫map.put 方法,present是乙個常量,存第乙個和第二個值的時候...