詳述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是乙個常量,存第乙個和第二個值的時候...