天天看點

TreeSet.add()方法一細節

treeset.add()方法一細節

   最近在一次使用treeset.add()方法中遇到了一個很迷惑的問題:往一個treeset集合中添加幾個對象的時候發現有些沒有添加進去,一開始是懷疑hashcode與equals的問題,因為set集合是不允許添加兩個相同對象的,但經查檢确認沒有問題,幾經測試發現是傳入的comporator對象引起的(即使用的是treeset(comparator<? super

e> comparator)構造方法),當其compare()方法傳回0時,隻能添加進一個對象,隻要目前添加的對象與集合中的任意一個對象比較時compare()方法傳回0,那麼該對象就添加不進去。以前一直以為compare()方法傳回0時隻是兩個對象的排列順序不确定,後經檢視源碼才明白其中的原因。

  下面是treeset的add()方法源碼:

其中m是一個treemap對象,其為treeset的實作是使用treemap的key部分來實作的,present是一個object對象,純粹是為了補全方法參數而已,下面是treemap.put()方法源碼:

下面是java.util.treemap.entry.setvalue(value)方法源碼:

可以看到更新了值後把以前的值傳回了。是以當compare方法的傳回值為了時,treemap.put()方法隻是傳回的是被替換掉的值,根本就沒有加入新的元素,當然m.put(e, present)==null 傳回的也為false了。

繼續閱讀