PRESENT只是一个虚拟值 – 集合并不真正关心它是什么。集合关心的是地图的键。所以逻辑就像这样:
Set.add(a):
map.put(a, PRESENT) // so far, this is just what you said
the key "a" is in the map, so...
keep the "a" key, but map its value to the PRESENT we just passed in
also, return the old value (which we'll call OLD)
look at the return value: it's OLD, != null. So return false.
现在,事实上OLD == PRESENT并不重要 – 并且注意Map.put不会更改键,只是映射到该键的值。由于地图的键是Set真正关心的,Set不变。
事实上,Set的底层结构已经发生了一些变化 – 它用(a,PRESENT)替换了(a,OLD)的映射。但是这不是从Set的实现外部可以看到。 (和发生一样,这种变化甚至不是真正的变化,因为OLD == PRESENT)。