HashSet源代碼:
這里以Hashset為主要例子
從以上的源代碼可以看出HashSet中真正管理元素的是 ?private transient ?HashMap<E,Object>?map;并且HashSet的元素是存儲在HashMap中的key中的变姨,了解HashMap的人知道key是不能重復的庆械。
HashSet的addAll方法:
下面通過一個例子來debug HashSet的add方法的具體實現(xiàn)
上述代碼很容易看出汗捡,先在構造的時候就加入了hello,world,java這三個元素,之后又通過addAll方法將元素重新添加一遍(addAll實際是循環(huán)add)。debug發(fā)現(xiàn)進入了AbstractCollection的addAll
繼續(xù)debug携丁,畫紅線的add是由HashSet的add方法完成的瘩扼。
PRESENT在圖一中有,是object實例媒鼓,實際中是不需要管理的届吁。
一些簡單的實驗:
在AbstractCollection的addAll方法中modified一開始是false,只有成功add一次才會變成true绿鸣,而返回的結果是由map put的返回值與null比較所得(map.put(e,PRESENT)==null;)疚沐。
從返回結果可以看出addAll沒有一次是add成功的,這也證實了set沒有元素是重復的枚驻。最后set輸出也只有一組hello,world,java濒旦。
補充一點:HashMap在put時是有返回值的,當key重復時會返回value再登,否則返回null(可以看源碼)尔邓。