我們知道,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是乙個常量,存第乙個和第二個值的時候...