詳述HashSet類add方法(一)

2021-10-05 07:12:41 字數 2386 閱讀 2600

我們知道,add方法可以用來向集合中新增元素,對於hashset集合來說,不允許儲存重複的元素,當我們儲存元素的時候,集合會對新增進來的元素進行判斷是否重複,首先我們對新加元素進行分析:

add方法原始碼:(jdk-11.0.4)

public

boolean

add(e e)

此時我們發現,返回值是乙個布林值,如果新增成功,則返回true,否則返回false,那麼其中用到了put方法,其屬於hashmap集合,用來將元素新增到hashmap中的key,而我們知道,hashmap集合是key和value一一對應的關係,也就是說key不允許重複,而此時顯然我們不需要新增value,此時的value值是乙個object常量,put方法原始碼如下

public v put

(k key, v value)

此時其中用到了putval和hash()方法:

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

if(e != null)

}++modcount;if(

++size > threshold)

resize()

;afternodeinsertion

(evict)

;return null;

}

hash()方法

static

final

inthash

(object key)

resize()方法:

final node

resize()

elseif(

(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]

; table = newtab;

if(oldtab != null)

else

}while

((e = next)

!= null);if

(lotail != null)

if(hitail != null)}}

}}return newtab;

}

也就是說,當我們新增乙個不存在的元素時, 首先呼叫hashset類中的add方法,實質上是通過hashmap型別的全域性變數map呼叫put方法。緊接著put方法呼叫putval方法,執行putval方法,table是乙個全域性變數,建立物件時並沒有給table賦值,因此,tab = table = null,執行第乙個if語句,呼叫resize方法。另tab等於resize方法的返回值。

在resize方法中,給全域性變數table賦值為newtab,newtab初始陣列長度為16,並且返回值也為newtab。又因為tab等於resize方法的返回值,所以第乙個if語句執行結束後table和tab指向同乙個位址,n = 16。

執行第二個if語句,第二個if語句的判斷條件是將hash值與(n-1)做按位與運算,動態的找到陣列的乙個元素,判斷是否為null。因為並未給陣列tab賦值陣列裡的元素一定都為null,所以if語句的判斷條件一定成立。if語句 tab[i] = newnode(hash, key, value, null);將傳入的結點賦值給在if語句判斷條件裡找到的那個陣列元素。

執行第三個也是最後乙個if語句,返回null。因為putval返回值為null,null = null,所以put方法的返回值為true,即add方法的返回值為true,新增成功。

詳述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 test2 1.呼叫hashset add 方法,原始碼如下 public boolean add e e 2.返回map.put 值,key為e,value值為present常量,方法原始碼如下 public ...

詳述HashSet類add方法(三)

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