Closed. This question needs to be more focused。它当前不接受答案。
想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
6年前关闭。
今天,面试官问我:Set如何保证不可重复?
其中,
将指定值与该映射中的指定键相关联。如果该映射先前包含该键的映射,则替换旧值。
...
...
返回:与键关联的先前值;如果没有键的映射关系,则返回null。 (返回null可能还表明该映射先前将null与key关联。)
因此,当您将重复元素放入set中时,此元素将作为键值
想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
6年前关闭。
今天,面试官问我:Set如何保证不可重复?
最佳答案
答案在于add
方法的源代码。例如,在TreeSet
的源代码中,add方法的实现如下:
public boolean add(E e)
{
return m.put(e, PRESENT)==null;
}
其中,
PRESENT
是Object
类的对象。而m
是NavigableMap
的对象。此NavigableMap
m
用于将元素e
作为key
存储,并将PRESENT
作为其value
存储到给定键e
。因此,m
中的每个键都具有相同的对象PRESENT
。 oracle doc中定义的put
的Map
方法是:将指定值与该映射中的指定键相关联。如果该映射先前包含该键的映射,则替换旧值。
...
...
返回:与键关联的先前值;如果没有键的映射关系,则返回null。 (返回null可能还表明该映射先前将null与key关联。)
因此,当您将重复元素放入set中时,此元素将作为键值
NavigableMap
放入PRESENT
中。如果NavigableMap
中不存在此键,则put
方法将返回null
,因此m.put(e,PRESENT)==null
返回true,我们知道该元素已添加。如果键已经存在于NavigableMap
中,则put
方法用PRESENT覆盖value
中key
e
的NavigableMap
并返回旧值(即PRESENT),因此m.put(e,PRESENT)==null
返回false
,我们知道未添加该元素。关于java - Set接口(interface)如何保证不可重复,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17432672/
10-10 22:33